油站正常都是24小时营业,员工按时间倒班,一般两班倒或是三班倒,每个班次轮换的时领班负责汇总当班次充值和加油情况,将汇总数据和现金移交财务或是下一班次领班,这个动作即是交班,每次交班都会产生新的班次,随后的充值或是消费都将计入新的班次。
班次管理功能分析
班次是油站运营中统计营业状况的最小单位,每笔充值或是消费都应归集到特定的班次,因此在油站创建后就应有一个初始班次,同时同一个油站在同一个时间也只能有一个班次;班次时常通常不是自然日的0点到24点,当需要按照自然日统计营业状况时单通过班次的开始和结束时间是无法完成的,因而每个班次应有一个归属日期来应对班次跨天的情况。综上,班次应至少有班次号、班次日期、所属油站、开始和结束时间、交班状态、交班员工、班次报表生成状态几个属性,并且在油站营业前被创建。
班次管理功能实现
1.添加班次报表状态字典
进入系统管理->字典管理,新增字典 “业务报表生成状态”,字典类型为biz_report_yes_no;添加字典项如下:
2.创建班次信息表
CREATETABLE`biz_shift`(
`id`intNOTNULLAUTO_INCREMENTCOMMENT'ID',
`dept_id`intNOTNULLCOMMENT'站点ID',
`shift_no`varchar(12)NOTNULLDEFAULT''COMMENT'班次号',
`shift_date`varchar(20)NOTNULLCOMMENT'班次日期',
`start_time`datetimeDEFAULTNULLCOMMENT'开始时间',
`is_end`tinyintNOTNULLDEFAULT'0'COMMENT'是否交班',
`end_time`datetimeDEFAULTNULLCOMMENT'结束时间',
`user_id`varchar(20)DEFAULT''COMMENT'交班员工ID',
`user_name`varchar(20)DEFAULT''COMMENT'交班员工姓名',
`created_time`datetimeDEFAULTCURRENT_TIMESTAMPCOMMENT'创建时间',
`next_shift_no`varchar(12)NOTNULLDEFAULT''COMMENT'下一个班次号',
`calc_report`tinyintNOTNULLDEFAULT'0'COMMENT'是否已生成报表',
`calc_report_time`datetimeDEFAULTNULLCOMMENT'报表生成时间',
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.生成业务代码
将数据表创建完成后,打开若依界面,选择系统工具->代码生成,点击“导入”按钮,在弹出框中选择biz_shift表,编辑代码生成配置,如下图:
4.修改菜单
班次在站点创建时初始化一次,以后在交班时结束当前班次并生成新的班次,同时生成班次报表,修改生成的菜单如下:
-- 菜单 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('班次记录导出',@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('查看班次报表',@parentId,'2','#','',1,0,'F','0','0','nxx:shift:report','#','admin',SYSDATE(),'',NULL,'');
5.复制domain和mapper
将domain和mapper目录下的文件复制到ruoyi-nxx-dao项目中,将service和controller代码复制到ruoyi-nxx-mgr项目中;
6.修改实体类和SQL
修改BizShift.java,添加站点名称字段,并修改BizShiftMapper.xml中的查询语句,结果如下:
@Getter
@Setter
@Accessors(chain=true)
@TableName("biz_shift")
publicclassBizShiftextendsBaseEntity{
/**
* ID
*/
privateLongid;
/**
* 站点ID
*/
@TableField("dept_id")
privateLongdeptId;
@TableField(exist=false)
@Excel(name="站点名称")
privateStringdeptName;
/**
* 班次号
*/
@TableField("shift_no")
@Excel(name="班次号")
privateStringshiftNo;
/**
* 班次日期
*/
@TableField("shift_date")
@Excel(name="班次日期")
privateStringshiftDate;
/**
* 开始时间
*/
@TableField("start_time")
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
@Excel(name="开始时间",width=30,dateFormat="yyyy-MM-dd HH:mm:ss")
privateDatestartTime;
/**
* 是否交班
*/
@TableField("is_end")
@Excel(name="是否交班")
privateIntegerisEnd;
/**
* 结束时间
*/
@TableField("end_time")
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
@Excel(name="结束时间",width=30,dateFormat="yyyy-MM-dd HH:mm:ss")
privateDateendTime;
/**
* 交班员工ID
*/
@TableField("user_id")
privateLonguserId;
/**
* 交班员工姓名
*/
@TableField("user_name")
@Excel(name="交班员工")
privateStringuserName;
/**
* 创建时间
*/
@TableField("created_time")
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
privateDatecreatedTime;
/**
* 下一个班次号
*/
@TableField("next_shift_no")
privateStringnextShiftNo;
/**
* 是否已生成报表
*/
@TableField("calc_report")
@Excel(name="已生成报表")
privateIntegercalcReport;
/**
* 报表生成时间
*/
@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>
<!--数据范围过滤-->
${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.添加数据权限
修改BizShiftServiceImpl.java中selectBizShiftList方法,添加数据权限注解,结果如下:
@Override
@DataScope(deptAlias="d")
publicList<BizShift>selectBizShiftList(BizShiftbizShift) {
returnbizShiftMapper.selectBizShiftList(bizShift);
}
8.添加班次初始化和交班接口
打开IBizShiftService.java添加油枪初始化接口int initBizShift(Long deptId, String deptName) 和 void endBizShift(Long deptId, String shiftNo),并在BizShiftServiceImpl.java中实现:
@Override
publicintinitBizShift(LongdeptId,StringdeptName) {
Assert.notNull(deptId,"站点号不能为空");
Assert.notNull(deptName,"站点名称不能为空");
LambdaQueryWrapper<BizShift>wrapper=newLambdaQueryWrapper<>();
wrapper.eq(BizShift::getDeptId,deptId).eq(BizShift::getIsEnd,0);
Assert.isTrue(bizShiftMapper.selectCount(wrapper)==0,"已存在班次,无需初始化.");
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,"站点号不能为空");
Assert.notNull(shiftNo,"班次号不能为空");
BizShiftbizShift=bizShiftMapper.selectBizShift(deptId,shiftNo,0);
Assert.notNull(bizShift,"班次不存在或已经交班"+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,"交班间隔时间不能小于一分钟.");
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);
}
打开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.修改班次前端页面
将生成代码中vue目录下的api和views目录复制到ruoyi-ui下src目录,修改nxx/shift/index.vue页面,添加班次初始化和交班接口,修改页面,如下:
打开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
})
}
打开ruoyi-ui/src/views/nxx/shift/index.vue 添加交班和查看报表入口:
<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">查看报表</el-button> </template>
</el-table-column>
import { endShift, listShift } from '@/api/nxx/shift'
handleEndShift(row) {
this.$modal
.confirm('是否确认交班?')
.then(function() {
return endShift({ deptId: row.deptId, shiftNo: row.shiftNo })
})
.then(() => {
this.getList()
this.$modal.msgSuccess('交班成功')
})
.catch(() => {})
},
handleViewReport(row) {
this.$modal.msgSuccess('报表开发中')
}
修改后效果如下:
10.添加班次初始化入口
打开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('初始化班次成功')
})
}
效果如下:
至此,班次管理已完成,并且支持数据权限控制。
演示地址:http://162.14.124.216:8000
账号密码:admin/admin123