????????油站正常都是24小時(shí)營(yíng)業(yè),員工按時(shí)間倒班,一般兩班倒或是三班倒,每個(gè)班次輪換的時(shí)領(lǐng)班負(fù)責(zé)匯總當(dāng)班次充值和加油情況,將匯總數(shù)據(jù)和現(xiàn)金移交財(cái)務(wù)或是下一班次領(lǐng)班,這個(gè)動(dòng)作即是交班,每次交班都會(huì)產(chǎn)生新的班次,隨后的充值或是消費(fèi)都將計(jì)入新的班次。
班次管理功能分析
? ? ? ?班次是油站運(yùn)營(yíng)中統(tǒng)計(jì)營(yíng)業(yè)狀況的最小單位,每筆充值或是消費(fèi)都應(yīng)歸集到特定的班次,因此在油站創(chuàng)建后就應(yīng)有一個(gè)初始班次,同時(shí)同一個(gè)油站在同一個(gè)時(shí)間也只能有一個(gè)班次;班次時(shí)常通常不是自然日的0點(diǎn)到24點(diǎn),當(dāng)需要按照自然日統(tǒng)計(jì)營(yíng)業(yè)狀況時(shí)單通過(guò)班次的開(kāi)始和結(jié)束時(shí)間是無(wú)法完成的,因而每個(gè)班次應(yīng)有一個(gè)歸屬日期來(lái)應(yīng)對(duì)班次跨天的情況。綜上,班次應(yīng)至少有班次號(hào)、班次日期、所屬油站、開(kāi)始和結(jié)束時(shí)間、交班狀態(tài)、交班員工、班次報(bào)表生成狀態(tài)幾個(gè)屬性,并且在油站營(yíng)業(yè)前被創(chuàng)建。
班次管理功能實(shí)現(xiàn)
1.添加班次報(bào)表狀態(tài)字典
進(jìn)入系統(tǒng)管理->字典管理,新增字典 “業(yè)務(wù)報(bào)表生成狀態(tài)”,字典類型為biz_report_yes_no;添加字典項(xiàng)如下:

2.創(chuàng)建班次信息表
CREATETABLE`biz_shift`(
`id`intNOTNULLAUTO_INCREMENTCOMMENT'ID',
`dept_id`intNOTNULLCOMMENT'站點(diǎn)ID',
`shift_no`varchar(12)NOTNULLDEFAULT''COMMENT'班次號(hào)',
`shift_date`varchar(20)NOTNULLCOMMENT'班次日期',
`start_time`datetimeDEFAULTNULLCOMMENT'開(kāi)始時(shí)間',
`is_end`tinyintNOTNULLDEFAULT'0'COMMENT'是否交班',
`end_time`datetimeDEFAULTNULLCOMMENT'結(jié)束時(shí)間',
`user_id`varchar(20)DEFAULT''COMMENT'交班員工ID',
`user_name`varchar(20)DEFAULT''COMMENT'交班員工姓名',
`created_time`datetimeDEFAULTCURRENT_TIMESTAMPCOMMENT'創(chuàng)建時(shí)間',
`next_shift_no`varchar(12)NOTNULLDEFAULT''COMMENT'下一個(gè)班次號(hào)',
`calc_report`tinyintNOTNULLDEFAULT'0'COMMENT'是否已生成報(bào)表',
`calc_report_time`datetimeDEFAULTNULLCOMMENT'報(bào)表生成時(shí)間',
PRIMARYKEY(`id`)USINGBTREE,
UNIQUEKEY`IDX_ID_NO`(`dept_id`,`shift_no`)USINGBTREE,
KEY`IDX_STATION_ID`(`dept_id`)USINGBTREE,
KEY`IDX_SHIFT_NO`(`shift_no`)USINGBTREE,
KEY`IDX_CALC_REPORT`(`calc_report`)USINGBTREE
)ENGINE=InnoDBAUTO_INCREMENT=1COMMENT='班次記錄'
3.生成業(yè)務(wù)代碼
將數(shù)據(jù)表創(chuàng)建完成后,打開(kāi)若依界面,選擇系統(tǒng)工具->代碼生成,點(diǎn)擊“導(dǎo)入”按鈕,在彈出框中選擇biz_shift表,編輯代碼生成配置,如下圖:

4.修改菜單
班次在站點(diǎn)創(chuàng)建時(shí)初始化一次,以后在交班時(shí)結(jié)束當(dāng)前班次并生成新的班次,同時(shí)生成班次報(bào)表,修改生成的菜單如下:
-- 菜單 SQL
INSERTINTOsys_menu(menu_name,parent_id,order_num,path,component,is_frame,is_cache,menu_type,visible,STATUS,perms,icon,create_by,create_time,update_by,update_time,remark)
VALUES('班次記錄','2004','1','shift','nxx/shift/index',1,0,'C','0','0','nxx:shift:list','#','admin',SYSDATE(),'',NULL,'班次記錄菜單');
-- 按鈕父菜單ID
SELECT@parentId:=LAST_INSERT_ID();
-- 按鈕 SQL
INSERTINTOsys_menu(menu_name,parent_id,order_num,path,component,is_frame,is_cache,menu_type,visible,STATUS,perms,icon,create_by,create_time,update_by,update_time,remark)
VALUES('班次記錄查詢',@parentId,'1','#','',1,0,'F','0','0','nxx:shift:query','#','admin',SYSDATE(),'',NULL,'');
INSERTINTOsys_menu(menu_name,parent_id,order_num,path,component,is_frame,is_cache,menu_type,visible,STATUS,perms,icon,create_by,create_time,update_by,update_time,remark)
VALUES('班次記錄導(dǎo)出',@parentId,'5','#','',1,0,'F','0','0','nxx:shift:export','#','admin',SYSDATE(),'',NULL,'');
INSERTINTOsys_menu(menu_name,parent_id,order_num,path,component,is_frame,is_cache,menu_type,visible,STATUS,perms,icon,create_by,create_time,update_by,update_time,remark)
VALUES('班次初始化',@parentId,'2','#','',1,0,'F','0','0','nxx:shift:init','#','admin',SYSDATE(),'',NULL,'');
INSERTINTOsys_menu(menu_name,parent_id,order_num,path,component,is_frame,is_cache,menu_type,visible,STATUS,perms,icon,create_by,create_time,update_by,update_time,remark)
VALUES('員工交班',@parentId,'2','#','',1,0,'F','0','0','nxx:shift:end','#','admin',SYSDATE(),'',NULL,'');
INSERTINTOsys_menu(menu_name,parent_id,order_num,path,component,is_frame,is_cache,menu_type,visible,STATUS,perms,icon,create_by,create_time,update_by,update_time,remark)
VALUES('查看班次報(bào)表',@parentId,'2','#','',1,0,'F','0','0','nxx:shift:report','#','admin',SYSDATE(),'',NULL,'');
5.復(fù)制domain和mapper
將domain和mapper目錄下的文件復(fù)制到ruoyi-nxx-dao項(xiàng)目中,將service和controller代碼復(fù)制到ruoyi-nxx-mgr項(xiàng)目中;
6.修改實(shí)體類和SQL
修改BizShift.java,添加站點(diǎn)名稱字段,并修改BizShiftMapper.xml中的查詢語(yǔ)句,結(jié)果如下:
@Getter
@Setter
@Accessors(chain=true)
@TableName("biz_shift")
publicclassBizShiftextendsBaseEntity{
/**
* ID
*/
privateLongid;
/**
* 站點(diǎn)ID
*/
@TableField("dept_id")
privateLongdeptId;
@TableField(exist=false)
@Excel(name="站點(diǎn)名稱")
privateStringdeptName;
/**
* 班次號(hào)
*/
@TableField("shift_no")
@Excel(name="班次號(hào)")
privateStringshiftNo;
/**
* 班次日期
*/
@TableField("shift_date")
@Excel(name="班次日期")
privateStringshiftDate;
/**
* 開(kāi)始時(shí)間
*/
@TableField("start_time")
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
@Excel(name="開(kāi)始時(shí)間",width=30,dateFormat="yyyy-MM-dd HH:mm:ss")
privateDatestartTime;
/**
* 是否交班
*/
@TableField("is_end")
@Excel(name="是否交班")
privateIntegerisEnd;
/**
* 結(jié)束時(shí)間
*/
@TableField("end_time")
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
@Excel(name="結(jié)束時(shí)間",width=30,dateFormat="yyyy-MM-dd HH:mm:ss")
privateDateendTime;
/**
* 交班員工ID
*/
@TableField("user_id")
privateLonguserId;
/**
* 交班員工姓名
*/
@TableField("user_name")
@Excel(name="交班員工")
privateStringuserName;
/**
* 創(chuàng)建時(shí)間
*/
@TableField("created_time")
@JsonFormat(pattern="yyyy-MM-dd? HH:mm:ss")
privateDatecreatedTime;
/**
* 下一個(gè)班次號(hào)
*/
@TableField("next_shift_no")
privateStringnextShiftNo;
/**
* 是否已生成報(bào)表
*/
@TableField("calc_report")
@Excel(name="已生成報(bào)表")
privateIntegercalcReport;
/**
* 報(bào)表生成時(shí)間
*/
@TableField("calc_report_time")
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
privateDatecalcReportTime;
}
<selectid="selectBizShiftList"parameterType="BizShift"resultMap="BizShiftResult">
SELECTs.*,d.`dept_name`FROMbiz_shift sINNERJOINsys_dept dONd.`dept_id`=s.`dept_id`
<where>1=1
<iftest="deptId != null ">ands.dept_id=#{deptId}</if>
<iftest="shiftNo != null? and shiftNo != ''">ands.shift_no=#{shiftNo}</if>
<iftest="shiftDate != null? and shiftDate != ''">ands.shift_date=#{shiftDate}</if>
<iftest="startTime != null ">ands.start_time=#{startTime}</if>
<iftest="isEnd != null ">ands.is_end=#{isEnd}</if>
<iftest="endTime != null ">ands.end_time=#{endTime}</if>
<iftest="userId != null? and userId != ''">ands.user_id=#{userId}</if>
<iftest="calcReport != null ">ands.calc_report=#{calcReport}</if>
</where>
<!--數(shù)據(jù)范圍過(guò)濾-->
${params.dataScope}
orderbys.is_endasc,s.iddesc
</select>
<selectid="selectBizShiftById"parameterType="Long"resultMap="BizShiftResult">
SELECTs.*,d.`dept_name`FROMbiz_shift sINNERJOINsys_dept dONd.`dept_id`=s.`dept_id`
wheres.id=#{id}
</select>
7.添加數(shù)據(jù)權(quán)限
修改BizShiftServiceImpl.java中selectBizShiftList方法,添加數(shù)據(jù)權(quán)限注解,結(jié)果如下:
@Override
@DataScope(deptAlias="d")
publicList<BizShift>selectBizShiftList(BizShiftbizShift) {
returnbizShiftMapper.selectBizShiftList(bizShift);
}
8.添加班次初始化和交班接口
打開(kāi)IBizShiftService.java添加油槍初始化接口int initBizShift(Long deptId, String deptName) 和 void endBizShift(Long deptId, String shiftNo),并在BizShiftServiceImpl.java中實(shí)現(xiàn):
@Override
publicintinitBizShift(LongdeptId,StringdeptName) {
Assert.notNull(deptId,"站點(diǎn)號(hào)不能為空");
Assert.notNull(deptName,"站點(diǎn)名稱不能為空");
LambdaQueryWrapper<BizShift>wrapper=newLambdaQueryWrapper<>();
wrapper.eq(BizShift::getDeptId,deptId).eq(BizShift::getIsEnd,0);
Assert.isTrue(bizShiftMapper.selectCount(wrapper)==0,"已存在班次,無(wú)需初始化.");
DateTimenowDate=DateUtil.date();
BizShiftbizShift=newBizShift()
.setDeptId(deptId).setDeptName(deptName)
.setShiftNo(getShiftNo(nowDate))
.setShiftDate(DateUtil.formatDate(nowDate))
.setIsEnd(0)
.setCalcReport(0);
bizShiftMapper.insertBizShift(bizShift);
return1;
?? }
@Override
@Transactional(rollbackFor=Exception.class)
publicvoidendBizShift(LongdeptId,StringshiftNo) {
Assert.notNull(deptId,"站點(diǎn)號(hào)不能為空");
Assert.notNull(shiftNo,"班次號(hào)不能為空");
BizShiftbizShift=bizShiftMapper.selectBizShift(deptId,shiftNo,0);
Assert.notNull(bizShift,"班次不存在或已經(jīng)交班"+shiftNo);
DatenowDate=newDate();
StringnewShiftNo=getShiftNo(nowDate);
LambdaQueryWrapper<BizShift>wrapper=newLambdaQueryWrapper<>();
wrapper.eq(BizShift::getDeptId,deptId).eq(BizShift::getShiftNo,newShiftNo);
Assert.isTrue(bizShiftMapper.selectCount(wrapper)==0,"交班間隔時(shí)間不能小于一分鐘.");
BizShiftnewShift=newBizShift()
.setDeptId(bizShift.getDeptId())
.setDeptName(bizShift.getDeptName())
.setStartTime(nowDate)
.setShiftNo(newShiftNo)
.setShiftDate(DateUtil.formatDate(nowDate))
.setIsEnd(0)
.setCalcReport(0);
bizShiftMapper.insertBizShift(newShift);
LoginUserloginUser=SecurityUtils.getLoginUser();
BizShiftupdateShift=newBizShift()
.setId(bizShift.getId())
.setIsEnd(1)
.setEndTime(nowDate)
.setUserId(loginUser.getUserId())
.setUserName(loginUser.getUsername())
.setNextShiftNo(newShift.getShiftNo());
bizShiftMapper.updateBizShift(updateShift);
?? }
打開(kāi)BizShiftController.java,添加初始化接口:
@PreAuthorize("@ss.hasPermi('nxx:shift:init')")
@Log(title="初始化",businessType=BusinessType.INSERT)
@PostMapping("/init")
publicAjaxResultinit(@RequestBodyBizShiftbizShift) {
returntoAjax(bizShiftService.initBizShift(bizShift.getDeptId(),bizShift.getDeptName()));
}
@PreAuthorize("@ss.hasPermi('nxx:shift:end')")
@Log(title="交班",businessType=BusinessType.UPDATE)
@PostMapping("/end")
publicAjaxResultendShift(@RequestBodyBizShiftbizShift) {
bizShiftService.endBizShift(bizShift.getDeptId(),bizShift.getShiftNo());
returnAjaxResult.success("交班成功");
}
9.修改班次前端頁(yè)面
將生成代碼中vue目錄下的api和views目錄復(fù)制到ruoyi-ui下src目錄,修改nxx/shift/index.vue頁(yè)面,添加班次初始化和交班接口,修改頁(yè)面,如下:
打開(kāi)ruoyi-ui/src/api/nxx/shift.js添加接口:
exportfunctioninitShift(data) {
returnrequest({
url:'/nxx/shift/init',
method:'post',
data:data
? })
}
exportfunctionendShift(data) {
returnrequest({
url:'/nxx/shift/end',
method:'post',
data:data
? })
}
打開(kāi)ruoyi-ui/src/views/nxx/shift/index.vue 添加交班和查看報(bào)表入口:
<el-table-columnlabel="操作"align="center"class-name="small-padding fixed-width">
<templateslot-scope="scope">
<el-buttonsize="mini"type="text"icon="el-icon-edit"@click="handleEndShift(scope.row)"v-hasPermi="['nxx:shift:end']"v-if="scope.row.isEnd===0">交班</el-button>
<el-buttonsize="mini"type="text"icon="el-icon-view"@click="handleViewReport(scope.row)"v-hasPermi="['nxx:shift:report']"v-if="scope.row.calcReport===1">查看報(bào)表</el-button>? ? </template>
</el-table-column>
import { endShift, listShift } from '@/api/nxx/shift'
handleEndShift(row) {
? ?? this.$modal
? ? ?? .confirm('是否確認(rèn)交班?')
? ? ?? .then(function() {
? ? ? ?? return endShift({ deptId: row.deptId, shiftNo: row.shiftNo })
? ? ?? })
? ? ?? .then(() => {
? ? ? ?? this.getList()
? ? ? ?? this.$modal.msgSuccess('交班成功')
? ? ?? })
? ? ?? .catch(() => {})
?? },
?? handleViewReport(row) {
? ?? this.$modal.msgSuccess('報(bào)表開(kāi)發(fā)中')
?? }
修改后效果如下:

10.添加班次初始化入口
打開(kāi)ruoyi-ui/src/views/nxx/deptext/index.vue,在油站列表操作列添加班次初始化按鈕:
<el-buttonsize="mini"type="text"icon="el-icon-document"@click="handleInitShift(scope.row)"v-hasPermi="['nxx:shift:init']">初始化班次</el-button>
import { initShift } from '@/api/nxx/shift'
handleInitShift(row) {
?? initShift({ deptId: row.deptId, deptName: row.deptName }).then(() => {
?? this.$modal.msgSuccess('初始化班次成功')
? })
}
效果如下:

至此,班次管理已完成,并且支持?jǐn)?shù)據(jù)權(quán)限控制。
演示地址:http://162.14.124.216:8000
賬號(hào)密碼:admin/admin123