1. 程式人生 > 實用技巧 >職工-工程資料庫課程設計

職工-工程資料庫課程設計

職工-工程資料庫課程設計

以下GUI介面均為Navicat

1) E-R總體圖&&關係模式

打⚪為主碼
部門 department(部門號did⚪,部門名dname)
職位 job(職位號jid⚪,職位名jname,小時工資率srate)
職工 staff(職工號sid⚪,職工名 sname,部門號did,職位 jid)
工程 project(工程號pid⚪,工程名pname,工程所在地pl,開始日期pst,結束日期pet)
打卡 clockio(打卡型別punchTheClock(0上班1下班),時間timestamp⚪,職工號sid⚪,工程號pid⚪)
職員變更(記錄號logid⚪,日期ltime,職工號sid,變更型別ctype,原先部門pd,現在部門cd,經手人handlerid)

2)DDL語句 建表/約束、儲存過程或函式

建表、約束:
  • CREATE TABLE `clockio` (
      `punchTheClock` tinyint(4) NOT NULL COMMENT '打卡型別(0上班1下班)',
      `time_stamp` timestamp NOT NULL COMMENT '時間',
      `sid` int(11) NOT NULL COMMENT '職工號',
      `pid` int(11) NOT NULL COMMENT '工程號',
      PRIMARY KEY (`time_stamp`,`sid`,`pid`) USING BTREE,
      KEY `sid` (`sid`),
      KEY `pid` (`pid`),
      CONSTRAINT `pid` FOREIGN KEY (`pid`) REFERENCES `project` (`pid`),
      CONSTRAINT `sid` FOREIGN KEY (`sid`) REFERENCES `staff` (`sid`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
    
  • CREATE TABLE `department` (
      `did` int(255) NOT NULL COMMENT '部門號',
      `dname` varchar(255) DEFAULT NULL COMMENT '部門名',
      KEY `did` (`did`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
    
  • CREATE TABLE `job` (
      `jid` int(11) NOT NULL COMMENT '職位號',
      `jname` varchar(255) DEFAULT NULL COMMENT '職位名',
      `srate` float(255,0) DEFAULT NULL COMMENT '小時工資率',
      PRIMARY KEY (`jid`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
    
  • CREATE TABLE `jobchanged` (
      `logid` int(11) NOT NULL AUTO_INCREMENT COMMENT '記錄號',
      `ltime` timestamp NOT NULL COMMENT '記錄發生時間',
      `sid` int(11) NOT NULL COMMENT '職工號',
      `ctype` varchar(255) NOT NULL COMMENT '變更型別',
      `pd` int(11) DEFAULT NULL COMMENT '原先部門號',
      `cd` int(11) DEFAULT NULL COMMENT '現在部門號',
      `handlerid` int(11) DEFAULT NULL COMMENT '經手人編號',
      PRIMARY KEY (`logid`),
      KEY `sid1` (`sid`),
      KEY `pd` (`pd`),
      KEY `cd` (`cd`),
      KEY `handlerid` (`handlerid`),
      CONSTRAINT `cd` FOREIGN KEY (`cd`) REFERENCES `department` (`did`),
      CONSTRAINT `handlerid` FOREIGN KEY (`handlerid`) REFERENCES `staff` (`sid`),
      CONSTRAINT `pd` FOREIGN KEY (`pd`) REFERENCES `department` (`did`),
      CONSTRAINT `sid1` FOREIGN KEY (`sid`) REFERENCES `staff` (`sid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
    
  • CREATE TABLE `project` (
      `pid` int(11) NOT NULL COMMENT '工程號',
      `pname` varchar(255) DEFAULT NULL COMMENT '工程名',
      `pl` varchar(255) DEFAULT NULL COMMENT '工程所在地',
      `pst` date DEFAULT NULL COMMENT '工程開始時間',
      `pet` date DEFAULT NULL COMMENT '工程結束時間',
      PRIMARY KEY (`pid`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
    
  • CREATE TABLE `staff` (
      `sid` int(11) NOT NULL COMMENT '職工號\r\n',
      `sname` varchar(255) DEFAULT NULL COMMENT '職工名',
      `did` int(11) DEFAULT NULL COMMENT '部門號',
      `jid` int(11) DEFAULT NULL COMMENT '職位號',
      PRIMARY KEY (`sid`),
      KEY `did` (`did`),
      KEY `jid` (`jid`),
      CONSTRAINT `did` FOREIGN KEY (`did`) REFERENCES `department` (`did`),
      CONSTRAINT `jid` FOREIGN KEY (`jid`) REFERENCES `job` (`jid`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
    
儲存過程/函式:

計算工程需要支付的工資:

CREATE DEFINER=`root`@`%` PROCEDURE `calculate_salary`(IN num INT,OUT result INT)
BEGIN
DECLARE exist INT;
DECLARE start_time TIMESTAMP;
DECLARE end_time TIMESTAMP;
SELECT count(*) INTO exist FROM project WHERE pid = num;
IF exist = 0 THEN
	SET result = -1;
ELSE
	SELECT DATE_FORMAT(pst,'%Y-%m-%d') INTO start_time FROM project WHERE pid = num;
	SELECT DATE_FORMAT(pet,'%Y-%m-%d') INTO end_time FROM project WHERE pid = num;
	SELECT SUM(TIMESTAMPDIFF(HOUR,stime,etime)*srate) INTO result 
	FROM 
	(SELECT a.sid,a.day1,stime,etime FROM
	((SELECT sid,DATE_FORMAT(time_stamp,'%Y-%m-%d') AS day1,min(DATE_FORMAT(time_stamp,'%Y-%m-%d %H:%i:%s')) stime	
	FROM clockio	
	WHERE punchTheClock = 0 AND pid = num AND 
	DATE_FORMAT(time_stamp,'%Y-%m-%d') between start_time and end_time group by sid,day1) a,
	(SELECT sid,DATE_FORMAT(time_stamp,'%Y-%m-%d') AS day1,max(DATE_FORMAT(time_stamp,'%Y-%m-%d %H:%i:%s')) etime	
	FROM clockio	
	WHERE punchTheClock = 1 AND pid = num AND 
	DATE_FORMAT(time_stamp,'%Y-%m-%d') between start_time and end_time group by sid,day1) b)
	WHERE a.sid = b.sid AND a.day1 = b.day1) AS job_time,staff,job 
	WHERE staff.sid = job_time.sid AND staff.jid = job.jid;
END IF;
END

職工職位變更:

CREATE DEFINER=`root`@`%` PROCEDURE `change_job`(IN `staff_id` int,IN `staff_name` varchar(255),IN `staff_job` int,IN `change_type` varchar(255),IN `new_department` int,IN `dealer` int,OUT `result` int)
BEGIN
	declare old_department int;
	IF change_type = 'enter' THEN
		INSERT staff VALUES(staff_id,staff_name,new_department,staff_job);
		INSERT jobchanged(ltime,sid,ctype,pd,cd,handlerid) values(NOW(),staff_id,change_type,null,new_department,		dealer);
		SET result=1;
	ELSEIF change_type = 'leave' THEN
		SELECT did INTO old_department FROM staff WHERE sid=staff_id;
		INSERT jobchanged(ltime,sid,ctype,pd,cd,handlerid) values(NOW(),staff_id,change_type,old_department,null,		dealer);
		DELETE from staff WHERE sid = staff_id;
		SET result=1;
	ELSE
		SELECT did INTO old_department FROM staff WHERE sid=staff_id;
		IF old_department = new_department THEN
			SET result=0;
		ELSE
			UPDATE staff SET did = new_department WHERE sid=staff_id;
			INSERT jobchanged(ltime,sid,ctype,pd,cd,handlerid) values(NOW(),staff_id,change_type,old_department,			new_department,dealer);
			SET result=1;
		END IF;
	END IF;
END

打卡:

CREATE DEFINER=`root`@`%` PROCEDURE `punch_in`(IN ptype tinyint,IN snum int,IN pnum int,OUT result INT)
BEGIN
DECLARE now_time TIMESTAMP;
DECLARE cnt INT;
DECLARE judge INT;
SELECT current_timestamp INTO now_time;
SELECT count(*) INTO cnt FROM clockio 
WHERE sid = snum AND punchTheClock = 0 
AND DATE_FORMAT(time_stamp,'%Y-%m-%d') = DATE_FORMAT(now_time,'%Y-%m-%d');
SELECT count(*) INTO judge FROM clockio 
WHERE sid = snum AND punchTheClock = ptype 
AND DATE_FORMAT(time_stamp,'%Y-%m-%d') = DATE_FORMAT(now_time,'%Y-%m-%d');
IF DATE_FORMAT(CURRENT_TIMESTAMP,'%H') NOT BETWEEN 0 AND 24 THEN
	SET result = 0;
ELSEIF judge >= 1 THEN
	SET result = 0;
ELSEIF cnt = 0 and ptype = 1 THEN
	SET result = 0;
ELSE
	INSERT INTO clockio VALUES(ptype,now_time,snum,pnum);
	SET result = 1;
END IF;
END

3)資料初始化

department表:

job表:

project表:

staff表:

clockio表:

jobchanged:

4)測試儲存過程/函式

測試工程2所需支付的所有工人酬金:

同理查詢工程1:

根據目前已有的打卡記錄可以驗證儲存過程函式運算正確:

測試員工職位變更:
  1. 進行入職操作:

    員工離職操作:

測試員工打卡:

當前時間為凌晨 不在允許打卡的範圍內 所以返回零

對其中判斷部分進行修改後重新執行 就成功了 多了一條新的資料

在本日沒有上班打卡的前提下進行下班打卡操作 也返回零 規避了打卡記錄錯亂的風險