diff --git a/ant-design-vue-jeecg/src/components/tools/HeaderNotice.vue b/ant-design-vue-jeecg/src/components/tools/HeaderNotice.vue index bef7d74..485f698 100644 --- a/ant-design-vue-jeecg/src/components/tools/HeaderNotice.vue +++ b/ant-design-vue-jeecg/src/components/tools/HeaderNotice.vue @@ -6,7 +6,7 @@ :arrowPointAtCenter="true" overlayClassName="header-notice-wrapper" @visibleChange="handleHoverChange" - :overlayStyle="{ width: '350px', top: '50px' }"> + :overlayStyle="{ width: '300px', top: '50px' }"> <template slot="content"> <a-spin :spinning="loadding"> <a-tabs> diff --git a/ant-design-vue-jeecg/src/views/system/UserList.vue b/ant-design-vue-jeecg/src/views/system/UserList.vue index af2c1a2..cecb056 100644 --- a/ant-design-vue-jeecg/src/views/system/UserList.vue +++ b/ant-design-vue-jeecg/src/views/system/UserList.vue @@ -94,11 +94,11 @@ </div> <a-table - :scroll="{x: 1200}" ref="table" - bordered size="middle" + bordered rowKey="id" + :scroll="{x:true}" :columns="columns" :dataSource="dataSource" :pagination="ipagination" @@ -261,8 +261,7 @@ export default { align: "center", dataIndex: 'selectedRoleList', key: 'selectedRoleList', - scopedSlots: {customRender: 'selectedRoleList'}, - width: 200 + scopedSlots: {customRender: 'selectedRoleList'} }, // { // title: '生日', @@ -285,16 +284,14 @@ export default { align: "center", dataIndex: 'selectedWarehouses', key: 'selectedWarehouses', - scopedSlots: {customRender: 'selectedWarehouses'}, - width: 200 + scopedSlots: {customRender: 'selectedWarehouses'} }, { title: '所属库区', align: "center", dataIndex: 'zoneCodes', key: 'zoneCodes', - scopedSlots: {customRender: 'zoneCodes'}, - width: 200 + scopedSlots: {customRender: 'zoneCodes'} }, // { // title: '部门', diff --git a/ant-design-vue-jeecg/src/views/system/config/ParameterConfigurationList.vue b/ant-design-vue-jeecg/src/views/system/config/ParameterConfigurationList.vue index abc41f8..cbffa90 100644 --- a/ant-design-vue-jeecg/src/views/system/config/ParameterConfigurationList.vue +++ b/ant-design-vue-jeecg/src/views/system/config/ParameterConfigurationList.vue @@ -96,7 +96,6 @@ :pagination="ipagination" :loading="loading" :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}" - class="j-table-force-nowrap" @change="handleTableChange"> <span slot="zoneCode" slot-scope="zoneCode"> @@ -202,12 +201,14 @@ export default { { title: '参数键值', align: "center", - dataIndex: 'value' + dataIndex: 'value', + width: 200, }, { title: '备注', align: "center", - dataIndex: 'remark' + dataIndex: 'remark', + width: 300 }, { title: '创建人', diff --git a/ant-design-vue-jeecg/src/views/system/lockStation/LockStationList.vue b/ant-design-vue-jeecg/src/views/system/lockStation/LockStationList.vue new file mode 100644 index 0000000..30d1a81 --- /dev/null +++ b/ant-design-vue-jeecg/src/views/system/lockStation/LockStationList.vue @@ -0,0 +1,212 @@ +<template> + <a-card :bordered="false"> + <!-- 查询区域 --> + <div class="table-page-search-wrapper"> + <a-form layout="inline" @keyup.enter.native="searchQuery"> + <a-row :gutter="24"> + <a-row :gutter="24"> + <a-col :xl="6" :lg="7" :md="8" :sm="24"> + <a-form-item label="站台"> + <j-input placeholder="请输入站台" v-model="queryParam.code"></j-input> + </a-form-item> + </a-col> + <a-col :xl="6" :lg="7" :md="8" :sm="24"> + <a-form-item label="任务号"> + <a-input placeholder="请输入任务号" v-model="queryParam.taskId"></a-input> + </a-form-item> + </a-col> + <a-col :xl="6" :lg="7" :md="8" :sm="24"> + <a-form-item label="状态"> + <j-dict-select-tag placeholder="请选择状态" v-model="queryParam.status" dictCode="port_lock_status"/> + </a-form-item> + </a-col> + <a-col :xl="6" :lg="7" :md="8" :sm="24"> + <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons"> + <a-button type="primary" @click="searchQuery" icon="search">查询</a-button> + <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button> + </span> + </a-col> + </a-row> + </a-row> + </a-form> + </div> + <!-- 查询区域-END --> + + <!-- 操作按钮区域 --> + <div class="table-operator"> + <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button> + <a-dropdown v-if="selectedRowKeys.length > 0"> + <a-menu slot="overlay"> + <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item> + </a-menu> + <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button> + </a-dropdown> + </div> + + <!-- table区域-begin --> + <div> + <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;"> + <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项 + <a style="margin-left: 24px" @click="onClearSelected">清空</a> + </div> + + <a-table + ref="table" + size="middle" + :scroll="{x:true}" + bordered + rowKey="id" + :columns="columns" + :dataSource="dataSource" + :pagination="ipagination" + :loading="loading" + :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}" + class="j-table-force-nowrap" + @change="handleTableChange"> + + <template slot="htmlSlot" slot-scope="text"> + <div v-html="text"></div> + </template> + <template slot="imgSlot" slot-scope="text"> + <span v-if="!text" style="font-size: 12px;font-style: italic;">无图片</span> + <img v-else :src="getImgView(text)" height="25px" alt="" style="max-width:80px;font-size: 12px;font-style: italic;"/> + </template> + <template slot="fileSlot" slot-scope="text"> + <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span> + <a-button + v-else + :ghost="true" + type="primary" + icon="download" + size="small" + @click="downloadFile(text)"> + 下载 + </a-button> + </template> + + <span slot="action" slot-scope="text, record"> + <a @click="handleEdit(record)">编辑</a> + + <a-divider type="vertical" /> + <a-dropdown> + <a class="ant-dropdown-link">更多 <a-icon type="down" /></a> + <a-menu slot="overlay"> + <a-menu-item> + <a @click="handleDetail(record)">详情</a> + </a-menu-item> + <a-menu-item> + <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)"> + <a>删除</a> + </a-popconfirm> + </a-menu-item> + </a-menu> + </a-dropdown> + </span> + + </a-table> + </div> + + <lock-station-modal ref="modalForm" @ok="modalFormOk"></lock-station-modal> + </a-card> +</template> + +<script> + + import '@/assets/less/TableExpand.less' + import { mixinDevice } from '@/utils/mixin' + import { JeecgListMixin } from '@/mixins/JeecgListMixin' + import LockStationModal from './modules/LockStationModal' + + export default { + name: 'LockStationList', + mixins:[JeecgListMixin, mixinDevice], + components: { + LockStationModal + }, + data () { + return { + description: '锁定站台管理页面', + // 表头 + columns: [ + { + title: '#', + dataIndex: '', + key:'rowIndex', + width:60, + align:"center", + customRender:function (t,r,index) { + return parseInt(index)+1; + } + }, + { + title:'仓库', + align:"center", + dataIndex: 'warehouseCode' + }, + { + title:'站台', + align:"center", + dataIndex: 'code' + }, + { + title:'任务ID', + align:"center", + dataIndex: 'taskId' + }, + { + title:'状态', + align:"center", + dataIndex: 'status_dictText' + }, + { + title:'库区', + align:"center", + dataIndex: 'zoneCode' + }, + { + title: '操作', + dataIndex: 'action', + align:"center", + fixed:"right", + width:147, + scopedSlots: { customRender: 'action' } + } + ], + url: { + list: "/lock/lockStation/list", + delete: "/lock/lockStation/delete", + deleteBatch: "/lock/lockStation/deleteBatch", + exportXlsUrl: "/lock/lockStation/exportXls", + importExcelUrl: "lock/lockStation/importExcel", + + }, + dictOptions:{}, + superFieldList:[], + } + }, + created() { + this.getSuperFieldList(); + }, + computed: { + importExcelUrl: function(){ + return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`; + }, + }, + methods: { + initDictConfig(){ + }, + getSuperFieldList(){ + let fieldList=[]; + fieldList.push({type:'string',value:'warehouseCode',text:'仓库',dictCode:''}) + fieldList.push({type:'string',value:'code',text:'站台',dictCode:''}) + fieldList.push({type:'string',value:'taskId',text:'任务ID',dictCode:''}) + fieldList.push({type:'int',value:'status',text:'状态',dictCode:''}) + fieldList.push({type:'string',value:'zoneCode',text:'库区',dictCode:''}) + this.superFieldList = fieldList + } + } + } +</script> +<style scoped> + @import '~@assets/less/common.less'; +</style> \ No newline at end of file diff --git a/ant-design-vue-jeecg/src/views/system/lockStation/modules/LockStationForm.vue b/ant-design-vue-jeecg/src/views/system/lockStation/modules/LockStationForm.vue new file mode 100644 index 0000000..60066ef --- /dev/null +++ b/ant-design-vue-jeecg/src/views/system/lockStation/modules/LockStationForm.vue @@ -0,0 +1,150 @@ +<template> + <a-spin :spinning="confirmLoading"> + <j-form-container :disabled="formDisabled"> + <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail"> + <a-row> + <a-col :span="24"> + <a-form-model-item label="仓库" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="warehouseCode"> + <a-input v-model="model.warehouseCode" placeholder="请输入仓库" ></a-input> + </a-form-model-item> + </a-col> + <a-col :span="24"> + <a-form-model-item label="站台" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="code"> + <j-search-select-tag + placeholder="请选择入库口" + v-model="model.code" + dict="port,name,code,type !='2'" + :pageSize="5" + :async="true"> + </j-search-select-tag> + </a-form-model-item> + </a-col> + <a-col :span="24"> + <a-form-model-item label="状态" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="status"> + <j-dict-select-tag v-model="model.status" title="状态" dictCode="port_lock_status" placeholder="请选择状态"/> + </a-form-model-item> + </a-col> + <a-col :span="24"> + <a-form-model-item label="库区" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="zoneCode"> + <a-select + show-search + placeholder="请选择库区" + option-filter-prop="children" + v-model="model.zoneCode"> + <a-select-option v-for="item in zoneList" :key="item.name" :value="item.code">{{ + item.name + }} + </a-select-option> + </a-select> + </a-form-model-item> + </a-col> + </a-row> + </a-form-model> + </j-form-container> + </a-spin> +</template> + +<script> + + import { httpAction, getAction } from '@/api/manage' + import { validateDuplicateValue } from '@/utils/util' + import {getZoneList} from '@/api/api' + + export default { + name: 'LockStationForm', + components: { + }, + props: { + //表单禁用 + disabled: { + type: Boolean, + default: false, + required: false + } + }, + data () { + return { + model:{ + }, + labelCol: { + xs: { span: 24 }, + sm: { span: 5 }, + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 16 }, + }, + confirmLoading: false, + validatorRules: { + code: [ + {required: true, message: '请选择站台!'}, + ], + status: [ + {required: true, message: '请选择状态!'}, + ], + }, + url: { + add: "/lock/lockStation/add", + edit: "/lock/lockStation/edit", + queryById: "/lock/lockStation/queryById" + }, + zoneList: [] + } + }, + computed: { + formDisabled(){ + return this.disabled + }, + }, + created () { + //备份model原始值 + this.modelDefault = JSON.parse(JSON.stringify(this.model)); + this.loadFrom(); + }, + methods: { + add () { + this.edit(this.modelDefault); + }, + edit (record) { + this.model = Object.assign({}, record); + this.visible = true; + }, + loadFrom() { + getZoneList().then((res) => { + if (res.success) { + this.zoneList = res.result + } + }); + }, + submitForm () { + const that = this; + // 触发表单验证 + this.$refs.form.validate(valid => { + if (valid) { + that.confirmLoading = true; + let httpurl = ''; + let method = ''; + if(!this.model.id){ + httpurl+=this.url.add; + method = 'post'; + }else{ + httpurl+=this.url.edit; + method = 'put'; + } + httpAction(httpurl,this.model,method).then((res)=>{ + if(res.success){ + that.$message.success(res.message); + that.$emit('ok'); + }else{ + that.$message.warning(res.message); + } + }).finally(() => { + that.confirmLoading = false; + }) + } + + }) + }, + } + } +</script> \ No newline at end of file diff --git a/ant-design-vue-jeecg/src/views/system/lockStation/modules/LockStationModal.Style#Drawer.vue b/ant-design-vue-jeecg/src/views/system/lockStation/modules/LockStationModal.Style#Drawer.vue new file mode 100644 index 0000000..4f0ca46 --- /dev/null +++ b/ant-design-vue-jeecg/src/views/system/lockStation/modules/LockStationModal.Style#Drawer.vue @@ -0,0 +1,84 @@ +<template> + <a-drawer + :title="title" + :width="width" + placement="right" + :closable="false" + @close="close" + destroyOnClose + :visible="visible"> + <lock-station-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit" normal></lock-station-form> + <div class="drawer-footer"> + <a-button @click="handleCancel" style="margin-bottom: 0;">关闭</a-button> + <a-button v-if="!disableSubmit" @click="handleOk" type="primary" style="margin-bottom: 0;">提交</a-button> + </div> + </a-drawer> +</template> + +<script> + + import LockStationForm from './LockStationForm' + + export default { + name: 'LockStationModal', + components: { + LockStationForm + }, + data () { + return { + title:"操作", + width:800, + visible: false, + disableSubmit: false + } + }, + methods: { + add () { + this.visible=true + this.$nextTick(()=>{ + this.$refs.realForm.add(); + }) + }, + edit (record) { + this.visible=true + this.$nextTick(()=>{ + this.$refs.realForm.edit(record); + }); + }, + close () { + this.$emit('close'); + this.visible = false; + }, + submitCallback(){ + this.$emit('ok'); + this.visible = false; + }, + handleOk () { + this.$refs.realForm.submitForm(); + }, + handleCancel () { + this.close() + } + } + } +</script> + +<style lang="less" scoped> +/** Button按钮间距 */ + .ant-btn { + margin-left: 30px; + margin-bottom: 30px; + float: right; + } + .drawer-footer{ + position: absolute; + bottom: -8px; + width: 100%; + border-top: 1px solid #e8e8e8; + padding: 10px 16px; + text-align: right; + left: 0; + background: #fff; + border-radius: 0 0 2px 2px; + } +</style> \ No newline at end of file diff --git a/ant-design-vue-jeecg/src/views/system/lockStation/modules/LockStationModal.vue b/ant-design-vue-jeecg/src/views/system/lockStation/modules/LockStationModal.vue new file mode 100644 index 0000000..668c74f --- /dev/null +++ b/ant-design-vue-jeecg/src/views/system/lockStation/modules/LockStationModal.vue @@ -0,0 +1,60 @@ +<template> + <j-modal + :title="title" + :width="width" + :visible="visible" + switchFullscreen + @ok="handleOk" + :okButtonProps="{ class:{'jee-hidden': disableSubmit} }" + @cancel="handleCancel" + cancelText="关闭"> + <lock-station-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit"></lock-station-form> + </j-modal> +</template> + +<script> + + import LockStationForm from './LockStationForm' + export default { + name: 'LockStationModal', + components: { + LockStationForm + }, + data () { + return { + title:'', + width:800, + visible: false, + disableSubmit: false + } + }, + methods: { + add () { + this.visible=true + this.$nextTick(()=>{ + this.$refs.realForm.add(); + }) + }, + edit (record) { + this.visible=true + this.$nextTick(()=>{ + this.$refs.realForm.edit(record); + }) + }, + close () { + this.$emit('close'); + this.visible = false; + }, + handleOk () { + this.$refs.realForm.submitForm(); + }, + submitCallback(){ + this.$emit('ok'); + this.visible = false; + }, + handleCancel () { + this.close() + } + } + } +</script> \ No newline at end of file diff --git a/ant-design-vue-jeecg/src/views/system/receipt/modules/ReceiptContainerStatusSelectModal.vue b/ant-design-vue-jeecg/src/views/system/receipt/modules/ReceiptContainerStatusSelectModal.vue index f8547f2..7bc63ca 100644 --- a/ant-design-vue-jeecg/src/views/system/receipt/modules/ReceiptContainerStatusSelectModal.vue +++ b/ant-design-vue-jeecg/src/views/system/receipt/modules/ReceiptContainerStatusSelectModal.vue @@ -24,6 +24,18 @@ /> </a-form-model-item> </a-col> + <a-col :lg="15"> + <a-form-model-item label="入库口"> + <!-- <a-input placeholder="请输入入库口" v-model="quickMainModel.toPort"/>--> + <j-search-select-tag + placeholder="请选择入库口" + v-model="model.fromPort" + dict="port,name,code,type !='2'" + :pageSize="5" + :async="true"> + </j-search-select-tag> + </a-form-model-item> + </a-col> </a-row> </a-form-model> </a-spin> diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java index 4070a46..a8494d0 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java @@ -165,15 +165,15 @@ public class WebSocket { * @param userId * @param sysAnnouncement */ - public void sendMessage(int userId, SysAnnouncement sysAnnouncement){ + public void sendMessage(int userId, SysAnnouncement sysAnnouncement) { sendMessage(String.valueOf(userId), createJson(sysAnnouncement)); } - public void sendMessage(List<SysUser> userList, SysAnnouncement announcement){ + public void sendMessage(List<SysUser> userList, SysAnnouncement announcement) { userList.forEach(user -> sendMessage(user.getId(), announcement)); } - private String createJson(SysAnnouncement announcement){ + private String createJson(SysAnnouncement announcement) { JSONObject obj = new JSONObject(); obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_TOPIC); obj.put(WebsocketConst.MSG_ID, announcement.getId()); @@ -185,7 +185,7 @@ public class WebSocket { * 广播系统消息 * @param sysAnnouncement */ - public void sendMessage(SysAnnouncement sysAnnouncement){ + public void sendMessage(SysAnnouncement sysAnnouncement) { sendMessage(createJson(sysAnnouncement)); } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/system/controller/LoginController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/system/controller/LoginController.java index f6d4fc5..54fc256 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/system/controller/LoginController.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/system/controller/LoginController.java @@ -197,8 +197,7 @@ public class LoginController { loginUser.setId(sysUser.getId() + ""); baseCommonService.addLog("用户名:" + username + ",登录成功!", CommonConstant.LOG_TYPE_1, null, loginUser); // update-end--Author:wangshuai Date:20200714 for:登录日志没有记录人员 - - systemSync.sendSysAnnouncement(sysUser); +// systemSync.sendSysAnnouncement(sysUser); return result; } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mobile/service/impl/MobileService.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mobile/service/impl/MobileService.java index ce3a28e..afcdc71 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mobile/service/impl/MobileService.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/mobile/service/impl/MobileService.java @@ -98,6 +98,7 @@ public class MobileService implements IMobileService { taskHeader.setInnernalTaskType(QuantityConstant.TASK_INTENERTYPE_SHIPMENT); taskHeader.setTaskType(QuantityConstant.TASK_TYPE_SORTINGSHIPMENT); } + taskHeader.setZoneCode(container.getZoneCode()); taskHeader.setCallBox(QuantityConstant.CALL_BOX); taskHeader.setContainerCode(containerCode); taskHeader.setStatus(QuantityConstant.TASK_STATUS_BUILD); diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/controller/WcsController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/controller/WcsController.java index 8123345..0715b1d 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/controller/WcsController.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/controller/WcsController.java @@ -8,6 +8,7 @@ import org.jeecg.common.aspect.annotation.AutoLog; import org.jeecg.modules.wms.api.wcs.entity.*; import org.jeecg.modules.wms.api.wcs.service.WcsService; import org.jeecg.modules.wms.framework.controller.HuahengBaseController; +import org.jeecg.modules.wms.lockStation.service.ILockStationService; import org.jeecg.modules.wms.task.taskHeader.service.ITaskHeaderService; import org.jeecg.utils.StringUtils; import org.jeecg.utils.interceptor.AccessLimit; @@ -30,6 +31,8 @@ public class WcsController extends HuahengBaseController { private WcsService wcsService; @Resource private ITaskHeaderService taskHeaderService; + @Resource + private ILockStationService lockStationService; /** ** WCS给的长,宽,高,重在有不同规格库位才有用,destination是区域, locationType库位类型 @@ -258,4 +261,34 @@ public class WcsController extends HuahengBaseController { }); return result; } + + /** + ** 解锁站台 + */ + @AutoLog(value = "解锁站台") + @PostMapping("/removeLockStation") + @ApiOperation("解锁站台") + @ApiLogger(apiName = "解锁站台", from = "WCS") + public Result removeLockStation(@RequestBody WcsTaskLock wcsTaskLock, HttpServletRequest req) { + String warehouseCode = wcsTaskLock.getWarehouseCode(); + String fromPort = wcsTaskLock.getFromPort(); + if (StringUtils.isEmpty(warehouseCode)) { + return Result.error("解锁站台, 仓库号为空"); + } + if (StringUtils.isEmpty(fromPort)) { + return Result.error("解锁站台, 站台为空"); + } + String lockKey = warehouseCode; + Result result = handleMultiProcess("removeLockStation", lockKey, new MultiProcessListener() { + + @Override + public Result<?> doProcess() { + if (!lockStationService.unlockStation(fromPort, warehouseCode)) { + return Result.error("解锁失败"); + } + return Result.ok("解锁成功"); + } + }); + return result; + } } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/entity/WcsTaskLock.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/entity/WcsTaskLock.java new file mode 100644 index 0000000..c9834d1 --- /dev/null +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/entity/WcsTaskLock.java @@ -0,0 +1,10 @@ +package org.jeecg.modules.wms.api.wcs.entity; + +import lombok.Data; + +@Data +public class WcsTaskLock { + + private String fromPort; + private String warehouseCode; +} diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wms/service/WmsServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wms/service/WmsServiceImpl.java index 3bc53e9..9f117ae 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wms/service/WmsServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wms/service/WmsServiceImpl.java @@ -13,11 +13,15 @@ import org.jeecg.modules.wms.api.erp.entity.*; import org.jeecg.modules.wms.api.erp.service.IErpService; import org.jeecg.modules.wms.api.wms.entity.WmsEntity; import org.jeecg.modules.wms.api.wms.entity.WmsInventory; +import org.jeecg.modules.wms.config.container.entity.Container; +import org.jeecg.modules.wms.config.container.service.IContainerService; +import org.jeecg.modules.wms.config.parameterConfiguration.service.IParameterConfigurationService; import org.jeecg.modules.wms.framework.service.IHuahengMultiHandlerService; import org.jeecg.modules.wms.inventory.inventoryHeader.entity.InventoryDetail; import org.jeecg.modules.wms.inventory.inventoryHeader.entity.InventoryHeader; import org.jeecg.modules.wms.inventory.inventoryHeader.service.IInventoryDetailService; import org.jeecg.modules.wms.inventory.inventoryHeader.service.IInventoryHeaderService; +import org.jeecg.modules.wms.lockStation.service.ILockStationService; import org.jeecg.modules.wms.receipt.receiptContainerHeader.entity.ReceiptContainerHeader; import org.jeecg.modules.wms.receipt.receiptContainerHeader.service.IReceiptContainerHeaderService; import org.jeecg.modules.wms.receipt.receiptHeader.entity.ReceiptDetail; @@ -56,35 +60,58 @@ public class WmsServiceImpl implements WmsService { @Resource private ITaskHeaderService taskHeaderService; + @Resource private IReceiptContainerHeaderService receiptContainerHeaderService; + @Resource private WmsService wmsService; + @Resource private IErpService erpService; + @Resource private IReceiveService receiveService; + @Resource private IReceiptHeaderService receiptHeaderService; + @Resource private IReceiptDetailService receiptDetailService; + @Resource private IHuahengMultiHandlerService huahengMultiHandlerService; + @Resource private IShipmentHeaderService shipmentHeaderService; + @Resource private IShipmentDetailService shipmentDetailService; + @Resource private IShipmentCombinationService shipmentCombinationService; + @Resource private IShipmentContainerHeaderService shipmentContainerHeaderService; + @Resource private IShipmentContainerDetailService shipmentContainerDetailService; + @Resource private IInventoryDetailService inventoryDetailService; + @Resource private IInventoryHeaderService inventoryHeaderService; + @Resource + private IContainerService containerService; + + @Resource + private IParameterConfigurationService parameterConfigurationService; + + @Resource + private ILockStationService lockStationService; + @Override @Transactional(rollbackFor = Exception.class) public Result sendWmsTask(WmsEntity wmsEntity) { @@ -123,6 +150,14 @@ public class WmsServiceImpl implements WmsService { String toPort = wmsEntity.getToPort(); String containerCode = wmsEntity.getContainerCode(); String referCode = wmsEntity.getTaskNo(); + Container container = containerService.getContainerByCode(containerCode, warehouseCode); + if (container == null) { + return Result.error("托盘:" + containerCode + " 信息为空"); + } + String zoneCode = container.getZoneCode(); + if (StringUtils.isEmpty(zoneCode)) { + return Result.error("容器没有配置库区,请配置!"); + } List<WmsInventory> wmsInventoryList = wmsEntity.getWmsInventoryList(); List<Receive> receiveList = new ArrayList<>(); if (wmsInventoryList == null) { @@ -194,6 +229,17 @@ public class WmsServiceImpl implements WmsService { throw new JeecgBootException("WMS下发入库信息,更新入库任务失败"); } } + if (wmsEntity.getTaskType() == QuantityConstant.TASK_TYPE_WHOLERECEIPT) { + String value = parameterConfigurationService.getValueByCode(QuantityConstant.START_LOCKING_STATION, zoneCode); + if (StringUtils.isNotEmpty(value)) { + int lockStation = Integer.parseInt(value); + if (lockStation == QuantityConstant.START_LOCK_STATION) { + if (!lockStationService.lockStation(toPort, warehouseCode)) { + throw new JeecgBootException("生成入库任务时,站台已经锁定:" + toPort); + } + } + } + } return result; } @@ -292,7 +338,6 @@ public class WmsServiceImpl implements WmsService { if (StringUtils.isEmpty(toPort)) { return Result.error("WMS下发出库任务失败,没有找到出库口" + toPort); } - InventoryHeader inventoryHeader = inventoryHeaderService.getInventoryHeaderByContainerCode(containerCode, warehouseCode); if (inventoryHeader == null) { return Result.error("WMS下发出库任务失败, 没有找到托盘库存" + containerCode); @@ -330,7 +375,6 @@ public class WmsServiceImpl implements WmsService { if (StringUtils.isEmpty(toPort)) { return Result.error("WMS下发出库任务失败,没有找到出库口" + toPort); } - List<InventoryDetail> inventoryDetailList = new ArrayList<>(); for (WmsInventory wmsInventory : wmsInventoryList) { String materialCode = wmsInventory.getMaterialCode(); @@ -365,8 +409,8 @@ public class WmsServiceImpl implements WmsService { public Result createEmptyIn(WmsEntity wmsEntity) { String warehouseCode = wmsEntity.getWarehouseCode(); String contaienrCode = wmsEntity.getContainerCode(); - - Result result = taskHeaderService.createEmptyIn(contaienrCode, QuantityConstant.EMPTY_STRING, warehouseCode); + String toPort = wmsEntity.getToPort(); + Result result = taskHeaderService.createEmptyIn(contaienrCode, QuantityConstant.EMPTY_STRING, warehouseCode, toPort); return result; } @@ -376,7 +420,6 @@ public class WmsServiceImpl implements WmsService { String warehouseCode = wmsEntity.getWarehouseCode(); String toPort = wmsEntity.getToPort(); String contaienrCode = wmsEntity.getContainerCode(); - Result result = taskHeaderService.createEmptyOut(contaienrCode, toPort, warehouseCode); return result; } @@ -385,5 +428,4 @@ public class WmsServiceImpl implements WmsService { public Result cancelTaskByUpstreamTaskNo(String taskNo) { return taskHeaderService.cancelTaskByUpstreamTaskNo(taskNo); } - } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/parameterConfiguration/controller/ParameterConfigurationController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/parameterConfiguration/controller/ParameterConfigurationController.java index d354203..b48f773 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/parameterConfiguration/controller/ParameterConfigurationController.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/parameterConfiguration/controller/ParameterConfigurationController.java @@ -32,6 +32,7 @@ import org.jeecgframework.poi.excel.entity.ImportParams; import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; import org.jeecg.common.system.base.controller.JeecgController; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; @@ -98,6 +99,7 @@ public class ParameterConfigurationController extends JeecgController<ParameterC @ApiOperation(value = "参数配置-编辑", notes = "参数配置-编辑") @RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST}) @RequiresPermissions("parameterConfiguration:edit") + @CacheEvict(value = "parameterConfigurationService", allEntries = true) public Result<String> edit(@RequestBody ParameterConfiguration parameterConfiguration) { parameterConfigurationService.updateById(parameterConfiguration); return Result.OK("编辑成功!"); @@ -112,6 +114,7 @@ public class ParameterConfigurationController extends JeecgController<ParameterC @ApiOperation(value = "参数配置-通过id删除", notes = "参数配置-通过id删除") @DeleteMapping(value = "/delete") @RequiresPermissions("parameterConfiguration:delete") + @CacheEvict(value = "parameterConfigurationService", allEntries = true) public Result<String> delete(@RequestParam(name = "id", required = true) String id) { parameterConfigurationService.removeById(id); return Result.OK("删除成功!"); @@ -126,6 +129,7 @@ public class ParameterConfigurationController extends JeecgController<ParameterC @ApiOperation(value = "参数配置-批量删除", notes = "参数配置-批量删除") @DeleteMapping(value = "/deleteBatch") @RequiresPermissions("parameterConfiguration:deleteBatch") + @CacheEvict(value = "parameterConfigurationService", allEntries = true) public Result<String> deleteBatch(@RequestParam(name = "ids", required = true) String ids) { this.parameterConfigurationService.removeByIds(Arrays.asList(ids.split(","))); return Result.OK("批量删除成功!"); diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/parameterConfiguration/service/impl/ParameterConfigurationServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/parameterConfiguration/service/impl/ParameterConfigurationServiceImpl.java index a8ee222..e8ed1e5 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/parameterConfiguration/service/impl/ParameterConfigurationServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/parameterConfiguration/service/impl/ParameterConfigurationServiceImpl.java @@ -6,6 +6,7 @@ import org.jeecg.modules.wms.config.parameterConfiguration.entity.ParameterConfi import org.jeecg.modules.wms.config.parameterConfiguration.mapper.ParameterConfigurationMapper; import org.jeecg.modules.wms.config.parameterConfiguration.service.IParameterConfigurationService; import org.jeecg.utils.constant.QuantityConstant; +import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -19,15 +20,18 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; * @Version: V1.0 */ @Service -public class ParameterConfigurationServiceImpl extends ServiceImpl<ParameterConfigurationMapper, ParameterConfiguration> implements IParameterConfigurationService { +public class ParameterConfigurationServiceImpl extends ServiceImpl<ParameterConfigurationMapper, ParameterConfiguration> + implements IParameterConfigurationService { @Resource IParameterConfigurationService parameterConfigurationService; @Override + @Cacheable(value = "parameterConfigurationService#3600", key = "#root.methodName + '_' + #code", unless = "#result == null") public String getValueByCode(String code) { LambdaQueryWrapper<ParameterConfiguration> parameterConfigurationLambdaQueryWrapper = Wrappers.lambdaQuery(); - parameterConfigurationLambdaQueryWrapper.eq(ParameterConfiguration::getCode, code).eq(ParameterConfiguration::getZoneCode, QuantityConstant.EMPTY_STRING); + parameterConfigurationLambdaQueryWrapper.eq(ParameterConfiguration::getCode, code).eq(ParameterConfiguration::getZoneCode, + QuantityConstant.EMPTY_STRING); ParameterConfiguration parameterConfiguration = getOne(parameterConfigurationLambdaQueryWrapper); if (parameterConfiguration == null) { return null; @@ -37,6 +41,7 @@ public class ParameterConfigurationServiceImpl extends ServiceImpl<ParameterConf } @Override + @Cacheable(value = "parameterConfigurationService#3600", key = "#root.methodName + '_' + #code + '_' + #zoneCode", unless = "#result == null") public String getValueByCode(String code, String zoneCode) { LambdaQueryWrapper<ParameterConfiguration> parameterConfigurationLambdaQueryWrapper = Wrappers.lambdaQuery(); parameterConfigurationLambdaQueryWrapper.eq(ParameterConfiguration::getCode, code).eq(ParameterConfiguration::getZoneCode, zoneCode); @@ -49,6 +54,7 @@ public class ParameterConfigurationServiceImpl extends ServiceImpl<ParameterConf } @Override + @Cacheable(value = "parameterConfigurationService#3600", key = "#root.methodName + '_' + #code + '_int'", unless = "#result == null") public int getValueIntByCode(String code) { LambdaQueryWrapper<ParameterConfiguration> parameterConfigurationLambdaQueryWrapper = Wrappers.lambdaQuery(); parameterConfigurationLambdaQueryWrapper.eq(ParameterConfiguration::getCode, code); diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/controller/HuahengBaseController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/controller/HuahengBaseController.java index bdea89d..b295e75 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/controller/HuahengBaseController.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/controller/HuahengBaseController.java @@ -88,9 +88,9 @@ public class HuahengBaseController { try { log.info("[{}] 开始分布式事务 lockKey = {},获取锁耗时: {}ms", taskName, fullLockKey, endTime - startTime); result = multiProcessListener.doProcess(); - } catch (Exception e) { + } catch (Throwable e) { log.error("[{}] 执行分布式事务失败 lockKey = {},errorMessage = {}", taskName, fullLockKey, ExceptionUtil.getMessage(e), e); - return Result.error(ExceptionUtil.getMessage(e)); + return Result.error(ExceptionUtil.getSimpleMessage(e)); } finally { redissonDistributedLocker.unlock(fullLockKey); final long finishTime = SystemClock.now(); diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/controller/LockStationController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/controller/LockStationController.java new file mode 100644 index 0000000..6df34d1 --- /dev/null +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/controller/LockStationController.java @@ -0,0 +1,156 @@ +package org.jeecg.modules.wms.lockStation.controller; + +import java.util.Arrays; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.modules.wms.lockStation.entity.LockStation; +import org.jeecg.modules.wms.lockStation.service.ILockStationService; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; + +import org.jeecg.common.system.base.controller.JeecgController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.jeecg.common.aspect.annotation.AutoLog; + + /** + * @Description: 锁定站台 + * @Author: jeecg-boot + * @Date: 2023-10-23 + * @Version: V1.0 + */ +@Api(tags="锁定站台") +@RestController +@RequestMapping("/lock/lockStation") +@Slf4j +public class LockStationController extends JeecgController<LockStation, ILockStationService> { + @Autowired + private ILockStationService lockStationService; + + /** + * 分页列表查询 + * + * @param lockStation + * @param pageNo + * @param pageSize + * @param req + * @return + */ + //@AutoLog(value = "锁定站台-分页列表查询") + @ApiOperation(value="锁定站台-分页列表查询", notes="锁定站台-分页列表查询") + @GetMapping(value = "/list") + public Result<IPage<LockStation>> queryPageList(LockStation lockStation, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + QueryWrapper<LockStation> queryWrapper = QueryGenerator.initQueryWrapper(lockStation, req.getParameterMap()); + Page<LockStation> page = new Page<LockStation>(pageNo, pageSize); + IPage<LockStation> pageList = lockStationService.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 添加 + * + * @param lockStation + * @return + */ + @AutoLog(value = "锁定站台-添加") + @ApiOperation(value="锁定站台-添加", notes="锁定站台-添加") + @PostMapping(value = "/add") + public Result<String> add(@RequestBody LockStation lockStation) { + lockStationService.save(lockStation); + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * + * @param lockStation + * @return + */ + @AutoLog(value = "锁定站台-编辑") + @ApiOperation(value="锁定站台-编辑", notes="锁定站台-编辑") + @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) + public Result<String> edit(@RequestBody LockStation lockStation) { + lockStationService.updateById(lockStation); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @AutoLog(value = "锁定站台-通过id删除") + @ApiOperation(value="锁定站台-通过id删除", notes="锁定站台-通过id删除") + @DeleteMapping(value = "/delete") + public Result<String> delete(@RequestParam(name="id",required=true) String id) { + lockStationService.removeById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @AutoLog(value = "锁定站台-批量删除") + @ApiOperation(value="锁定站台-批量删除", notes="锁定站台-批量删除") + @DeleteMapping(value = "/deleteBatch") + public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) { + this.lockStationService.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + //@AutoLog(value = "锁定站台-通过id查询") + @ApiOperation(value="锁定站台-通过id查询", notes="锁定站台-通过id查询") + @GetMapping(value = "/queryById") + public Result<LockStation> queryById(@RequestParam(name="id",required=true) String id) { + LockStation lockStation = lockStationService.getById(id); + if(lockStation==null) { + return Result.error("未找到对应数据"); + } + return Result.OK(lockStation); + } + + /** + * 导出excel + * + * @param request + * @param lockStation + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, LockStation lockStation) { + return super.exportXls(request, lockStation, LockStation.class, "锁定站台"); + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, LockStation.class); + } + +} diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/entity/LockStation.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/entity/LockStation.java new file mode 100644 index 0000000..43f117d --- /dev/null +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/entity/LockStation.java @@ -0,0 +1,67 @@ +package org.jeecg.modules.wms.lockStation.entity; + +import java.io.Serializable; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import org.jeecg.common.aspect.annotation.Dict; +import org.jeecgframework.poi.excel.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @Description: 锁定站台 + * @Author: jeecg-boot + * @Date: 2023-10-23 + * @Version: V1.0 + */ +@Data +@TableName("lock_station") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="lock_station对象", description="锁定站台") +public class LockStation implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "主键") + private String id; + /**仓库*/ + @Excel(name = "仓库", width = 15) + @ApiModelProperty(value = "仓库") + private String warehouseCode; + /**站台*/ + @Excel(name = "站台", width = 15) + @ApiModelProperty(value = "站台") + private String code; + /**任务ID*/ + @Excel(name = "任务ID", width = 15) + @ApiModelProperty(value = "任务ID") + private String taskId; + /**状态*/ + @Excel(name = "状态", width = 15, dicCode = "port_lock_status") + @Dict(dicCode = "port_lock_status") + @ApiModelProperty(value = "状态") + private Integer status; + /**库区*/ + @Excel(name = "库区", width = 15) + @ApiModelProperty(value = "库区") + private String zoneCode; + /**创建人*/ + @ApiModelProperty(value = "创建人") + private String createBy; + /**创建日期*/ + @ApiModelProperty(value = "创建日期") + private Date createTime; + /**更新人*/ + @ApiModelProperty(value = "更新人") + private String updateBy; + /**更新日期*/ + @ApiModelProperty(value = "更新日期") + private Date updateTime; +} diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/mapper/LockStationMapper.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/mapper/LockStationMapper.java new file mode 100644 index 0000000..9ab56f1 --- /dev/null +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/mapper/LockStationMapper.java @@ -0,0 +1,14 @@ +package org.jeecg.modules.wms.lockStation.mapper; + +import org.jeecg.modules.wms.lockStation.entity.LockStation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 锁定站台 + * @Author: jeecg-boot + * @Date: 2023-10-23 + * @Version: V1.0 + */ +public interface LockStationMapper extends BaseMapper<LockStation> { + +} diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/mapper/xml/LockStationMapper.xml b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/mapper/xml/LockStationMapper.xml new file mode 100644 index 0000000..9947183 --- /dev/null +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/mapper/xml/LockStationMapper.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="org.jeecg.modules.wms.lockStation.mapper.LockStationMapper"> + +</mapper> diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/service/ILockStationService.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/service/ILockStationService.java new file mode 100644 index 0000000..10ddc49 --- /dev/null +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/service/ILockStationService.java @@ -0,0 +1,34 @@ +package org.jeecg.modules.wms.lockStation.service; + +import org.jeecg.modules.wms.lockStation.entity.LockStation; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: 锁定站台 + * @Author: jeecg-boot + * @Date: 2023-10-23 + * @Version: V1.0 + */ +public interface ILockStationService extends IService<LockStation> { + + /** + * 锁定站台,需判断当前站台是否是非锁定状态 + * @author zengxiangping + * @createDate 2023年10月23日 + * @param port + * @param warehouseCode + * @return + */ + boolean lockStation(String port, String warehouseCode); + + /** + * 解锁站台 + * @author zengxiangping + * @createDate 2023年10月23日 + * @param port + * @param warehouseCode + * @return + */ + boolean unlockStation(String port, String warehouseCode); + +} diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/service/impl/LockStationServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/service/impl/LockStationServiceImpl.java new file mode 100644 index 0000000..01c9be9 --- /dev/null +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/lockStation/service/impl/LockStationServiceImpl.java @@ -0,0 +1,59 @@ +package org.jeecg.modules.wms.lockStation.service.impl; + +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import org.jeecg.common.exception.JeecgBootException; +import org.jeecg.modules.wms.lockStation.entity.LockStation; +import org.jeecg.modules.wms.lockStation.mapper.LockStationMapper; +import org.jeecg.modules.wms.lockStation.service.ILockStationService; +import org.jeecg.utils.constant.QuantityConstant; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.transaction.annotation.Transactional; + +/** + * @Description: 锁定站台 + * @Author: jeecg-boot + * @Date: 2023-10-23 + * @Version: V1.0 + */ +@Service +public class LockStationServiceImpl extends ServiceImpl<LockStationMapper, LockStation> implements ILockStationService { + + /** + * 锁定站台,需判断当前站台是否是非锁定状态 + * @author zengxiangping + * @createDate 2023年10月23日 + * @param port + * @param warehouseCode + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean lockStation(String port, String warehouseCode) { + if (port == null) { + throw new JeecgBootException("锁定站台,传入站台号为空"); + } + LambdaUpdateWrapper<LockStation> lockStationLambdaUpdateWrapper = Wrappers.lambdaUpdate(); + lockStationLambdaUpdateWrapper.eq(LockStation::getCode, port).eq(LockStation::getWarehouseCode, warehouseCode) + .eq(LockStation::getStatus, QuantityConstant.UNLOCK).set(LockStation::getStatus, QuantityConstant.LOCK); + return update(lockStationLambdaUpdateWrapper); + } + + /** + * 解锁站台 + * @author zengxiangping + * @createDate 2023年10月23日 + * @param port + * @param warehouseCode + * @return + */ + @Override + public boolean unlockStation(String port, String warehouseCode) { + LambdaUpdateWrapper<LockStation> lockStationLambdaUpdateWrapper = Wrappers.lambdaUpdate(); + lockStationLambdaUpdateWrapper.eq(LockStation::getCode, port).eq(LockStation::getWarehouseCode, warehouseCode).set(LockStation::getStatus, + QuantityConstant.UNLOCK); + return update(lockStationLambdaUpdateWrapper); + } +} diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/job/AutoCheckoutTask.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/job/AutoCheckoutTask.java index 93df7ef..0e424b9 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/job/AutoCheckoutTask.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/job/AutoCheckoutTask.java @@ -63,13 +63,12 @@ public class AutoCheckoutTask implements Job { for (Container container : containerList) { String zoneCode = container.getZoneCode(); String warehouseCode = container.getWarehouseCode(); - String toPort = null; - if (StringUtils.isEmpty(zoneCode)) { - toPort = autoCheckOutDtoList.get(0).getToPort(); - } else { + String toPort = autoCheckOutDtoList.get(0).getToPort(); + if (!StringUtils.isEmpty(zoneCode)) { for (AutoCheckOutDto autoCheckOutDto : autoCheckOutDtoList) { if (zoneCode.equals(autoCheckOutDto.getZoneCode())) { toPort = autoCheckOutDto.getToPort(); + break; } } } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/entity/ReceiptContainerHeader.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/entity/ReceiptContainerHeader.java index f615a95..4604414 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/entity/ReceiptContainerHeader.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/entity/ReceiptContainerHeader.java @@ -65,6 +65,10 @@ public class ReceiptContainerHeader implements Serializable { @Excel(name = "目标库位", width = 15) @ApiModelProperty(value = "目标库位") private String toLocationCode; + /** 起始入库口 */ + @Excel(name = "起始入库口", width = 15) + @ApiModelProperty(value = "起始入库口") + private String fromPort; /** 目标出入口 */ @Excel(name = "目标出入口", width = 15) @ApiModelProperty(value = "目标出入口") diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/impl/ReceiptContainerHeaderServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/impl/ReceiptContainerHeaderServiceImpl.java index eb70b13..151c60a 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/impl/ReceiptContainerHeaderServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/impl/ReceiptContainerHeaderServiceImpl.java @@ -16,6 +16,7 @@ import org.jeecg.modules.wms.config.container.service.IContainerService; import org.jeecg.modules.wms.config.location.service.ILocationService; import org.jeecg.modules.wms.config.parameterConfiguration.service.IParameterConfigurationService; import org.jeecg.modules.wms.inventory.inventoryHeader.service.IInventoryHeaderService; +import org.jeecg.modules.wms.lockStation.service.ILockStationService; import org.jeecg.modules.wms.receipt.receiptContainerHeader.entity.ReceiptContainerDetail; import org.jeecg.modules.wms.receipt.receiptContainerHeader.entity.ReceiptContainerHeader; import org.jeecg.modules.wms.receipt.receiptContainerHeader.mapper.ReceiptContainerDetailMapper; @@ -91,6 +92,9 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContai @Resource private IParameterConfigurationService parameterConfigurationService; + @Resource + private ILockStationService lockStationService; + @Override @Transactional public void delMain(String id) { @@ -132,6 +136,15 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContai String fromLocationCode = receiptContainerHeader.getFromLocationCode(); String toLocationCode = receiptContainerHeader.getToLocationCode(); int taskType = receiptContainerHeader.getTaskType(); + String fromPort = receiptContainerHeader.getFromPort(); + Container container = containerService.getContainerByCode(containerCode, warehouseCode); + if (container == null) { + return Result.error("托盘:" + containerCode + " 信息为空"); + } + String zoneCode = container.getZoneCode(); + if (StringUtils.isEmpty(zoneCode)) { + return Result.error("容器没有配置库区,请配置!"); + } boolean success = false; List<ReceiptContainerDetail> receiptContainerDetailList = receiptContainerDetailService.getReceiptContainerDetailListByHeaderId(receiptContainerHeader.getId()); @@ -155,7 +168,9 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContai throw new JeecgBootException(result.getMessage()); } TaskLockEntity taskLockEntity = (TaskLockEntity)result.getResult(); - String zoneCode = taskLockEntity.getZoneCode(); + if (taskLockEntity.getZoneCode() != null) { + zoneCode = taskLockEntity.getZoneCode(); + } taskHeader = new TaskHeader(); taskHeader.setContainerCode(containerCode); taskHeader.setContainerFillStatus(containerFillStatus); @@ -244,6 +259,15 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContai throw new JeecgBootException("创建入库任务, 更新入库单明细失败"); } } + String value = parameterConfigurationService.getValueByCode(QuantityConstant.START_LOCKING_STATION,zoneCode); + if (StringUtils.isNotEmpty(value)) { + int lockStation = Integer.parseInt(value); + if (lockStation == QuantityConstant.START_LOCK_STATION) { + if (!lockStationService.lockStation(fromPort, warehouseCode)) { + throw new JeecgBootException("生成入库任务时,站台已经锁定:" + fromPort); + } + } + } LogRecordContext.putVariable("taskHeader", taskHeader);// 操作日志收集 LogRecordContext.putVariable("receiptContainerDetailList", receiptContainerDetailList);// 操作日志收集 LogRecordContext.putVariable("extraJsonString1", JSON.toJSONString(receiptContainerDetailList));// 操作日志收集 diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/controller/TaskHeaderController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/controller/TaskHeaderController.java index c5a8ea5..26c1a02 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/controller/TaskHeaderController.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/controller/TaskHeaderController.java @@ -425,11 +425,12 @@ public class TaskHeaderController extends HuahengBaseController { public Result createEmptyIn(@RequestBody TaskHeader taskHeader, HttpServletRequest req) { String contaienrCode = taskHeader.getContainerCode(); String toLocationCode = taskHeader.getToLocationCode(); + String toPortCode = taskHeader.getToPortCode(); String warehouseCode = HuahengJwtUtil.getWarehouseCodeByToken(req); Result result = handleMultiProcess("createEmptyIn", new MultiProcessListener() { @Override public Result<?> doProcess() { - Result result = taskHeaderService.createEmptyIn(contaienrCode, toLocationCode, warehouseCode); + Result result = taskHeaderService.createEmptyIn(contaienrCode, toLocationCode, warehouseCode,toPortCode); return result; } }); diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskHeaderService.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskHeaderService.java index 67b1d04..73952ea 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskHeaderService.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskHeaderService.java @@ -131,7 +131,7 @@ public interface ITaskHeaderService extends IService<TaskHeader> { * @param warehouseCode * @return */ - Result<TaskHeader> createEmptyIn(String containerCode, String toLocationCode, String warehouseCode); + Result<TaskHeader> createEmptyIn(String containerCode, String toLocationCode, String warehouseCode, String toPortCode); /** * 创建空托盘出库任务 diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java index 5482c16..4f383c9 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java @@ -32,6 +32,7 @@ import org.jeecg.modules.wms.inventory.inventoryHeader.service.IInventoryDetailS import org.jeecg.modules.wms.inventory.inventoryHeader.service.IInventoryHeaderService; import org.jeecg.modules.wms.inventory.inventoryTransaction.entity.InventoryTransaction; import org.jeecg.modules.wms.inventory.inventoryTransaction.service.IInventoryTransactionService; +import org.jeecg.modules.wms.lockStation.service.ILockStationService; import org.jeecg.modules.wms.receipt.receiptContainerHeader.entity.ReceiptContainerHeader; import org.jeecg.modules.wms.receipt.receiptContainerHeader.service.IReceiptContainerHeaderService; import org.jeecg.modules.wms.receipt.receiptHeader.entity.ReceiptDetail; @@ -150,6 +151,8 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea private ITaskHeaderHistoryService taskHeaderHistoryService; @Resource private IShipmentCombinationService shipmentCombinationService; + @Resource + private ILockStationService lockStationService; @Override @Transactional @@ -974,7 +977,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea */ @Override @Transactional(rollbackFor = Exception.class) - public Result<TaskHeader> createEmptyIn(String containerCode, String toLocationCode, String warehouseCode) { + public Result<TaskHeader> createEmptyIn(String containerCode, String toLocationCode, String warehouseCode, String toPortCode) { log.info("开始创建空托入库任务" + containerCode); if (StringUtils.isEmpty(containerCode)) { return Result.error("创建空托盘入库时, 托盘号为空"); @@ -982,6 +985,17 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea if (StringUtils.isEmpty(warehouseCode)) { return Result.error("创建空托盘入库时, 仓库编码为空"); } +// if (StringUtils.isEmpty(toPortCode)) { +// return Result.error("创建空托盘入库时, 站台编码为空"); +// } +// Container container = containerService.getContainerByCode(containerCode, warehouseCode); +// if (container == null) { +// return Result.error("托盘:" + containerCode + " 信息为空"); +// } +// String zoneCode = container.getZoneCode(); +// if (StringUtils.isEmpty(zoneCode)) { +// return Result.error("容器没有配置库区,请配置!"); +// } Result result = taskHeaderService.createTaskLockContainerAndLocation(QuantityConstant.TASK_TYPE_EMPTYRECEIPT, containerCode, QuantityConstant.EMPTY_STRING, toLocationCode, warehouseCode); @@ -995,7 +1009,17 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea taskHeader.setInnernalTaskType(QuantityConstant.TASK_INTENERTYPE_RECEIPT); taskHeader.setToLocationCode(toLocationCode); taskHeader.setStatus(QuantityConstant.TASK_STATUS_BUILD); +// taskHeader.setZoneCode(zoneCode); boolean success = taskHeaderService.save(taskHeader); +// String value = parameterConfigurationService.getValueByCode(QuantityConstant.START_LOCKING_STATION, zoneCode); +// if (StringUtils.isNotEmpty(value)) { +// int lockStation = Integer.parseInt(value); +// if (lockStation == QuantityConstant.START_LOCK_STATION) { +// if (!lockStationService.lockStation(toPortCode, warehouseCode)) { +// throw new JeecgBootException("生成入库任务时,站台已经锁定:" + toPortCode); +// } +// } +// } log.info("完成创建空托入库任务"); if (!success) { throw new JeecgBootException("创建空托盘入库时,保存任务失败"); diff --git a/huaheng-wms-core/src/main/java/org/jeecg/utils/OkHttpUtils.java b/huaheng-wms-core/src/main/java/org/jeecg/utils/OkHttpUtils.java index 209a7f7..e26b8ce 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/utils/OkHttpUtils.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/utils/OkHttpUtils.java @@ -84,7 +84,7 @@ public class OkHttpUtils { * OkHTTP线程池空闲线程存活时间(秒) */ public final static long KEEP_ALIVE_DURATION = 60; - + /** * 最大读取时间(秒) */ @@ -100,7 +100,6 @@ public class OkHttpUtils { */ public final static int MAX_RENTRY_COUNT_FAST = 0; - private static final String CONTENT_TYPE = "Content-Type"; /** 访问接口参数配置 */ @@ -249,7 +248,7 @@ public class OkHttpUtils { } return result; } - + /** * JSONString形式发送POST请求 * @throws Exception diff --git a/huaheng-wms-core/src/main/java/org/jeecg/utils/aspect/TaskBuildAudienceAspect.java b/huaheng-wms-core/src/main/java/org/jeecg/utils/aspect/TaskBuildAudienceAspect.java index cf92c41..a9dd3dd 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/utils/aspect/TaskBuildAudienceAspect.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/utils/aspect/TaskBuildAudienceAspect.java @@ -1,14 +1,35 @@ package org.jeecg.utils.aspect; +import java.lang.reflect.Method; +import java.util.Date; +import java.util.List; + +import javax.annotation.Resource; + import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.jeecg.modules.system.service.ISysAnnouncementService; +import org.jeecg.modules.wms.config.parameterConfiguration.service.IParameterConfigurationService; import org.jeecg.utils.HuahengJwtUtil; +import org.jeecg.utils.constant.QuantityConstant; import org.jeecg.utils.support.ApiAuthentication; +import org.jeecg.utils.support.SystemSync; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.stereotype.Component; +import com.aliyuncs.utils.StringUtils; + +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUnit; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.exceptions.ExceptionUtil; +import cn.hutool.core.text.StrSpliter; +import cn.hutool.extra.spring.SpringUtil; import lombok.extern.slf4j.Slf4j; /** @@ -22,6 +43,15 @@ import lombok.extern.slf4j.Slf4j; @EnableAsync public class TaskBuildAudienceAspect { + @Resource + IParameterConfigurationService parameterConfigurationService; + + @Resource + ISysAnnouncementService sysAnnouncementService; + + @Resource + SystemSync systemSync; + @Pointcut("execution(* org.jeecg.modules.wms.monitor.job.*Task.execute(..))") public void executeTask() {} @@ -29,4 +59,48 @@ public class TaskBuildAudienceAspect { public void doBefore(JoinPoint joinPoint) throws NoSuchMethodException, Throwable { new ApiAuthentication.ApiAuthenticationBuild().audience(HuahengJwtUtil.TASK_AUDIENCE_NAME).bulid(); } + + @Around("executeTask()") + public Object doAround(ProceedingJoinPoint joinPoint) throws NoSuchMethodException { + String className = getClassAndMethodName(joinPoint); + long t1 = System.currentTimeMillis(); + try { + // 执行下一个切面方法,若无则执行目标方法 + Object object = joinPoint.proceed(); + // 执行被拦截的方法 + long t2 = System.currentTimeMillis(); + String taskRunNoticeClassNames = parameterConfigurationService.getValueByCode(QuantityConstant.RULE_TASK_RUN_NOTICE_CLASS_NAME); + String noticeName = className + " 定时任务执行完成"; + String costTimeString = "耗时:" + (t2 - t1) + "ms"; + if (!StringUtils.isEmpty(taskRunNoticeClassNames)) { + List<String> taskRunNoticeClassNameList = StrSpliter.split(taskRunNoticeClassNames, ",", true, true); + String userOrRoleString = parameterConfigurationService.getValueByCode(QuantityConstant.RULE_JOB_EXCEPTION_NOTICE_ROLE_OR_NAME); + List<String> userOrRoleList = StrSpliter.split(userOrRoleString, ",", true, true); + for (String taskRunNoticeClassName : taskRunNoticeClassNameList) { + if (className.contains(taskRunNoticeClassName)) { + sysAnnouncementService.quickAnnouncementToUserOrRole(userOrRoleList, noticeName, costTimeString, DateUtil.offsetMinute(new Date(), 1), "L"); + break; + } + } + } + log.info(noticeName + " " + costTimeString); + return object; + } catch (Throwable e) { + long t2 = System.currentTimeMillis(); + String userOrRoleString = parameterConfigurationService.getValueByCode(QuantityConstant.RULE_JOB_EXCEPTION_NOTICE_ROLE_OR_NAME); + List<String> userOrRoleList = StrSpliter.split(userOrRoleString, ",", true, true); + String noticeName = className + " 定时任务执行异常"; + String errorString = "异常信息:" + ExceptionUtil.getMessage(e) + " 耗时:" + (t2 - t1) + "ms"; + systemSync.sumCountAnnouncementToUserOrRole(userOrRoleList, noticeName, errorString, DateUtil.offsetDay(new Date(), 1), "H", 10); + log.error(noticeName, e); + } + return null; + } + + // 获取方法类名 + private String getClassAndMethodName(ProceedingJoinPoint joinPoint) throws NoSuchMethodException { + // 获取目标类对象 + Class<?> aClass = joinPoint.getTarget().getClass(); + return aClass.getSimpleName(); + } } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/utils/constant/QuantityConstant.java b/huaheng-wms-core/src/main/java/org/jeecg/utils/constant/QuantityConstant.java index cb0641c..c24f4ab 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/utils/constant/QuantityConstant.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/utils/constant/QuantityConstant.java @@ -307,9 +307,6 @@ public class QuantityConstant { /** 移库 */ public static final Integer INVENTORY_TRANSACTION_TRANSFER = 50; - /** 收货 */ - public static final Integer INVENTORY_TRANSACTION_RECEIVE = 60; - // 12、调整单状态 // 未批准 @@ -340,12 +337,20 @@ public class QuantityConstant { // 13、质检单类型 - /** 来料质检 */ - public static final String QUALITY_TYPE_INCOMING = "QI"; - /** 库内全检 */ - public static final String QUALITY_TYPE_INHOUSE_FULL = "QIF"; - /** 库内抽检 */ - public static final String QUALITY_TYPE_INHOUSE_PART = "QIP"; + // 入库质检 + public static final Integer CHECK_TYPE_RECEIPT = 100; + + // 在库全检 + public static final Integer CHECK_TYPE_FULL = 200; + + // 在库抽检 + public static final Integer CHECK_TYPE_SELECT = 300; + + // 空货架 + public static final Integer POINTS_EMPTY = 0; + + // 非空货架 + public static final Integer POINTS_SOME = 1; // 14、AGV任务 /** AGV取放货任务 */ @@ -397,15 +402,7 @@ public class QuantityConstant { public static final Integer RECEIVE_HEADER_HALF = 100; // 收货单完成收货状态 public static final Integer RECEIVE_HEADER_COMPLETE = 200; - // 生成质检单 - public static final Integer RECEIVE_HEADER_QUALITY = 300; - - // 新建 - public static final Integer QUALITY_HEADER_BUILD = 0; - // 部分质检 - public static final Integer QUALITY_HEADER_HALF = 100; - // 质检完成 - public static final Integer QUALITY_HEADER_COMPLETE = 200; + /** 对接WCS可用巷道API */ public static final String ADDRESS_WCS_AVAILABLE_ROWDWAY = "WCS_AVAILABLE_ROWDWAY"; @@ -454,14 +451,8 @@ public class QuantityConstant { public static final String PLATFORM_CODING = "赋码系统"; public static final String PLATFORM_ERP = "ERP"; public static final String PLATFORM_WMS = "WMS"; - // 良品 + // good public static final String QUALITY_GOOD = "good"; - // 次品 - public static final String QUALITY_DEFECTIVE = "defective"; - // 报废品 - public static final String QUALITY_SCRAP = "scrap"; - // 待确认 - public static final String QUALITY_DISUSSED = "discussed"; // 发送AGV任务成功 public static final int AGV_NEED_SEND = 0; @@ -524,18 +515,26 @@ public class QuantityConstant { * 出库依赖库区 */ public static final int SHIPMENT_BY_ZONE = 1; - - /** 对接WCS可用巷道API:关闭 */ + + /** 对接WCS可用巷道API:关闭 */ public static final String AVAILABLE_ROWDWAY_CLOSE = "0"; - + /** 对接WCS可用巷道API:开启 */ public static final String AVAILABLE_ROWDWAY_OPEN = "1"; - + /** 启用获取可用巷道API */ public static final String RULE_AVAILABLE_ROWDWAY_STATUS = "availableRowdwayStatus"; - - /** 接口异常响应通知配置 */ + + /** 接口异常响应通知配置 */ + + /** 定时任务异常响应通知配置 */ + public static final String RULE_JOB_EXCEPTION_NOTICE_ROLE_OR_NAME = "jobExceptionNoticeRoleOrName"; + + /** 接口异常响应通知配置 */ public static final String RULE_API_EXCEPTION_NOTICE_ROLE_OR_NAME = "apiExceptionNoticeRoleOrName"; + + /** 定时任务执行消息通知配置 */ + public static final String RULE_TASK_RUN_NOTICE_CLASS_NAME = "taskRunNoticeClassName"; public static final int RULE_TASK_NOT_CLEAR = 0; public static final int RULE_TASK_AllOW_CLEAR = 1; @@ -703,4 +702,17 @@ public class QuantityConstant { public static final String ZONE_TYPE_TILL = "Q"; /** 库区类型,虚拟区 */ public static final String ZONE_TYPE_UNREAL = "X"; + + public static final String START_LOCKING_STATION = "StartLockingStation"; + + public static int LOCK = 1; // 锁定 + + public static int UNLOCK = 0; // 解锁 + +// 开启站台锁定 + public static int START_LOCK_STATION = 1; + +// 关闭站台锁定 + public static int START_UNLOCK_STATION = 0; + }