07-微信油站管理系统-班次管理

        油站正常都是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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,639评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,277评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,221评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,474评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,570评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,816评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,957评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,718评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,176评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,511评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,646评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,322评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,934评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,755评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,987评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,358评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,514评论 2 348

推荐阅读更多精彩内容