diff --git a/jeecg-boot-master/ant-design-vue-jeecg/src/api/api.js b/jeecg-boot-master/ant-design-vue-jeecg/src/api/api.js index 4e63655..b450fc9 100644 --- a/jeecg-boot-master/ant-design-vue-jeecg/src/api/api.js +++ b/jeecg-boot-master/ant-design-vue-jeecg/src/api/api.js @@ -106,6 +106,7 @@ export const getReceiptTypeList = (params)=>getAction('/config/receiptType/getRe export const getShipmentTypeList = (params)=>getAction('/config/shipmentType/getShipmentTypeList', params); export const searchMaterialByCode = (params)=>postAction('/config/material/searchMaterialByCode', params); export const listReceiveByReceiptId = (params)=>postAction('/receipt/receiveHeader/listReceiveByReceiptId', params); +export const createTask = (params)=>postAction('/receipt/receiptContainerHeader/createTask', params); // 中转HTTP请求 diff --git a/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/receipt/ReceiptContainerHeaderList.vue b/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/receipt/ReceiptContainerHeaderList.vue index 69a0eca..63cc739 100644 --- a/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/receipt/ReceiptContainerHeaderList.vue +++ b/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/receipt/ReceiptContainerHeaderList.vue @@ -113,7 +113,8 @@ <span slot="action" slot-scope="text, record"> <a @click="handleEdit(record)">编辑</a> - + <a-divider type="vertical" /> + <a @click="createTask(record)">生成任务</a> <a-divider type="vertical" /> <a-dropdown> <a class="ant-dropdown-link">更多 <a-icon type="down" /></a> @@ -148,6 +149,7 @@ import ReceiptContaienrDetailList from './ReceiptContaienrDetailList' import {initDictOptions,filterMultiDictText} from '@/components/dict/JDictSelectUtil' import '@/assets/less/TableExpand.less' + import {createTask} from '@/api/api' export default { name: "ReceiptContainerHeaderList", @@ -159,6 +161,7 @@ data () { return { description: '入库组盘管理页面', + querySource:{}, // 表头 columns: [ { @@ -277,6 +280,16 @@ this.selectedRowKeys = selectedRowKeys; this.selectionRows = selectionRows; }, + createTask(record){ + this.loading = true; + const that = this; + this.model = Object.assign({}, record); + that.querySource.id = record.id; + createTask(that.querySource).then((res) => { + this.loading = false; + this.search(); + }); + }, loadData(arg) { if(!this.url.list){ this.$message.error("请设置url.list属性!") diff --git a/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/receipt/modules/ReceiptHeaderModal.vue b/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/receipt/modules/ReceiptHeaderModal.vue index 73b60ba..82b1495 100644 --- a/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/receipt/modules/ReceiptHeaderModal.vue +++ b/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/receipt/modules/ReceiptHeaderModal.vue @@ -100,8 +100,8 @@ ], }, url: { - add: "/config/receiptHeader/add", - edit: "/config/receiptHeader/edit", + add: "/receipt/receiptHeader/add", + edit: "/receipt/receiptHeader/edit", } } diff --git a/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/task/TaskDetailList.vue b/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/task/TaskDetailList.vue new file mode 100644 index 0000000..b2a85b1 --- /dev/null +++ b/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/task/TaskDetailList.vue @@ -0,0 +1,227 @@ +<template> + <a-card :bordered="false" :class="'cust-erp-sub-tab'"> + <!-- 操作按钮区域 --> + <div class="table-operator" v-if="mainId"> + <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button> + <a-button type="primary" icon="download" @click="handleExportXls('任务详情')">导出</a-button> + <a-upload + name="file" + :showUploadList="false" + :multiple="false" + :headers="tokenHeader" + :action="importExcelUrl" + @change="handleImportExcel"> + <a-button type="primary" icon="import">导入</a-button> + </a-upload> + <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" + bordered + rowKey="id" + :scroll="{x:true}" + :columns="columns" + :dataSource="dataSource" + :pagination="ipagination" + :loading="loading" + :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}" + @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-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)"> + <a>删除</a> + </a-popconfirm> + </span> + + </a-table> + </div> + + <taskDetail-modal ref="modalForm" @ok="modalFormOk" :mainId="mainId"></taskDetail-modal> + </a-card> +</template> + +<script> + + import { JeecgListMixin } from '@/mixins/JeecgListMixin' + import TaskDetailModal from './modules/TaskDetailModal' + + export default { + name: "TaskDetailList", + mixins:[JeecgListMixin], + components: { TaskDetailModal }, + props:{ + mainId:{ + type:String, + default:'', + required:false + } + }, + watch:{ + mainId:{ + immediate: true, + handler(val) { + if(!this.mainId){ + this.clearList() + }else{ + this.queryParam['taskHeaderId'] = val + this.loadData(1); + } + } + } + }, + data () { + return { + description: '任务表管理页面', + disableMixinCreated:true, + // 表头 + columns: [ + { + title: '#', + dataIndex: '', + key:'rowIndex', + width:60, + align:"center", + customRender:function (t,r,index) { + return parseInt(index)+1; + } + }, + { + title:'货主', + align:"center", + dataIndex: 'companyCode' + }, + { + title:'物料编码', + align:"center", + dataIndex: 'materialCode' + }, + { + title:'物料名称', + align:"center", + dataIndex: 'materialName' + }, + { + title:'物料规格', + align:"center", + dataIndex: 'materialSpec' + }, + { + title:'物料单位', + align:"center", + dataIndex: 'materialUnit' + }, + { + title:'数量', + align:"center", + dataIndex: 'qty' + }, + { + title:'批次', + align:"center", + dataIndex: 'batch' + }, + { + title:'库存状态', + align:"center", + dataIndex: 'inventoryStatus_dictText', + }, + { + title:'创建人', + align:"center", + dataIndex: 'createBy' + }, + { + title:'创建日期', + align:"center", + dataIndex: 'createTime' + }, + { + title:'更新人', + align:"center", + dataIndex: 'updateBy' + }, + { + title:'更新日期', + align:"center", + dataIndex: 'updateTime' + }, + { + title: '操作', + dataIndex: 'action', + align:"center", + fixed:"right", + width:147, + scopedSlots: { customRender: 'action' }, + } + ], + url: { + list: "/task/taskHeader/listTaskDetailByMainId", + delete: "/task/taskHeader/deleteTaskDetail", + deleteBatch: "/task/taskHeader/deleteBatchTaskDetail", + exportXlsUrl: "/task/taskHeader/exportTaskDetail", + importUrl: "/task/taskHeader/importTaskDetail", + }, + dictOptions:{ + taskType:[], + isEmptyOut:[], + isDoubleIn:[], + status:[], + } + } + }, + created() { + }, + computed: { + importExcelUrl(){ + return `${window._CONFIG['domianURL']}/${this.url.importUrl}/${this.mainId}`; + } + }, + methods: { + clearList(){ + this.dataSource=[] + this.selectedRowKeys=[] + this.ipagination.current = 1 + } + + } + } +</script> +<style scoped> + @import '~@assets/less/common.less' +</style> diff --git a/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/task/TaskHeaderList.vue b/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/task/TaskHeaderList.vue new file mode 100644 index 0000000..41d05ed --- /dev/null +++ b/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/task/TaskHeaderList.vue @@ -0,0 +1,368 @@ +<template> + <a-card :bordered="false"> + <!-- 查询区域 --> + <div class="table-page-search-wrapper"> + <a-form layout="inline" @keyup.enter.native="searchQuery"> + <a-row :gutter="24"> + <a-col :xl="6" :lg="7" :md="8" :sm="24"> + <a-form-item label="任务类型"> + <j-dict-select-tag placeholder="请选择任务类型" v-model="queryParam.taskType" dictCode="task_type"/> + </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.containerCode"></a-input> + </a-form-item> + </a-col> + <template v-if="toggleSearchStatus"> + <a-col :xl="6" :lg="7" :md="8" :sm="24"> + <a-form-item label="起始库位"> + <a-input placeholder="请输入起始库位" v-model="queryParam.fromLocationCode"></a-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.toLocationCode"></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.isEmptyOut" dictCode="is_or_not"/> + </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.isDoubleIn" dictCode="is_or_not"/> + </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.originLocationCode"></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="task_header_status"/> + </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.fromPort"></a-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.toPort"></a-input> + </a-form-item> + </a-col> + <a-col :xl="10" :lg="11" :md="12" :sm="24"> + <a-form-item label="创建日期"> + <j-date :show-time="true" date-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择开始时间" class="query-group-cust" v-model="queryParam.createTime_begin"></j-date> + <span class="query-group-split-cust"></span> + <j-date :show-time="true" date-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择结束时间" class="query-group-cust" v-model="queryParam.createTime_end"></j-date> + </a-form-item> + </a-col> + </template> + <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> + <a @click="handleToggleSearch" style="margin-left: 8px"> + {{ toggleSearchStatus ? '收起' : '展开' }} + <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/> + </a> + </span> + </a-col> + </a-row> + </a-form> + </div> + <!-- 查询区域-END --> + + <!-- 操作按钮区域 --> + <div class="table-operator"> + <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button> + <a-button type="primary" icon="download" @click="handleExportXls('任务表')">导出</a-button> + <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel"> + <a-button type="primary" icon="import">导入</a-button> + </a-upload> + <!-- 高级查询区域 --> + <j-super-query :fieldList="superFieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query> + </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" + bordered + rowKey="id" + class="j-table-force-nowrap" + :scroll="{x:true}" + :columns="columns" + :dataSource="dataSource" + :pagination="ipagination" + :loading="loading" + :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange, type:'radio'}" + :customRow="clickThenSelect" + @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-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)"> + <a>删除</a> + </a-popconfirm> + </a-menu-item> + </a-menu> + </a-dropdown> + </span> + + </a-table> + </div> + + <a-tabs defaultActiveKey="1"> + <a-tab-pane tab="任务详情" key="1" > + <TaskDetailList :mainId="selectedMainId" /> + </a-tab-pane> + </a-tabs> + + <taskHeader-modal ref="modalForm" @ok="modalFormOk"></taskHeader-modal> + </a-card> +</template> + +<script> + + import { JeecgListMixin } from '@/mixins/JeecgListMixin' + import TaskHeaderModal from './modules/TaskHeaderModal' + import { getAction } from '@/api/manage' + import TaskDetailList from './TaskDetailList' + import {initDictOptions,filterMultiDictText} from '@/components/dict/JDictSelectUtil' + import '@/assets/less/TableExpand.less' + + export default { + name: "TaskHeaderList", + mixins:[JeecgListMixin], + components: { + TaskDetailList, + TaskHeaderModal + }, + data () { + return { + description: '任务表管理页面', + // 表头 + columns: [ + { + title:'任务类型', + align:"center", + dataIndex: 'taskType_dictText', + }, + { + title:'容器号', + align:"center", + dataIndex: 'containerCode' + }, + { + title:'起始库位', + align:"center", + dataIndex: 'fromLocationCode' + }, + { + title:'目标库位', + align:"center", + dataIndex: 'toLocationCode' + }, + { + title:'是否空出', + align:"center", + dataIndex: 'isEmptyOut_dictText', + }, + { + title:'是否重入', + align:"center", + dataIndex: 'isDoubleIn_dictText', + }, + { + title:'重入库位号', + align:"center", + dataIndex: 'originLocationCode' + }, + { + title:'任务状态', + align:"center", + dataIndex: 'status_dictText', + }, + { + title:'起始出入口', + align:"center", + dataIndex: 'fromPort' + }, + { + title:'目标出入口', + align:"center", + dataIndex: 'toPort' + }, + { + title:'创建人', + align:"center", + dataIndex: 'createBy' + }, + { + title:'创建日期', + align:"center", + dataIndex: 'createTime' + }, + { + title:'更新人', + align:"center", + dataIndex: 'updateBy' + }, + { + title:'更新日期', + align:"center", + dataIndex: 'updateTime' + }, + { + title: '操作', + dataIndex: 'action', + align:"center", + fixed:"right", + width:147, + scopedSlots: { customRender: 'action' }, + } + ], + url: { + list: "/task/taskHeader/list", + delete: "/task/taskHeader/delete", + deleteBatch: "/task/taskHeader/deleteBatch", + exportXlsUrl: "/task/taskHeader/exportXls", + importExcelUrl: "task/taskHeader/importExcel", + }, + dictOptions:{ + taskType:[], + isEmptyOut:[], + isDoubleIn:[], + status:[], + }, + /* 分页参数 */ + ipagination:{ + current: 1, + pageSize: 5, + pageSizeOptions: ['5', '10', '50'], + showTotal: (total, range) => { + return range[0] + "-" + range[1] + " 共" + total + "条" + }, + showQuickJumper: true, + showSizeChanger: true, + total: 0 + }, + selectedMainId:'', + superFieldList:[], + } + }, + created() { + this.getSuperFieldList(); + }, + computed: { + importExcelUrl: function(){ + return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`; + } + }, + methods: { + initDictConfig(){ + }, + clickThenSelect(record) { + return { + on: { + click: () => { + this.onSelectChange(record.id.split(","), [record]); + } + } + } + }, + onClearSelected() { + this.selectedRowKeys = []; + this.selectionRows = []; + this.selectedMainId='' + }, + onSelectChange(selectedRowKeys, selectionRows) { + this.selectedMainId=selectedRowKeys[0] + this.selectedRowKeys = selectedRowKeys; + this.selectionRows = selectionRows; + }, + loadData(arg) { + if(!this.url.list){ + this.$message.error("请设置url.list属性!") + return + } + //加载数据 若传入参数1则加载第一页的内容 + if (arg === 1) { + this.ipagination.current = 1; + } + this.onClearSelected() + var params = this.getQueryParams();//查询条件 + this.loading = true; + getAction(this.url.list, params).then((res) => { + if (res.success) { + this.dataSource = res.result.records; + this.ipagination.total = res.result.total; + } + if(res.code===510){ + this.$message.warning(res.message) + } + this.loading = false; + }) + }, + getSuperFieldList(){ + let fieldList=[]; + fieldList.push({type:'int',value:'taskType',text:'任务类型',dictCode:'task_type'}) + fieldList.push({type:'string',value:'containerCode',text:'容器号',dictCode:''}) + fieldList.push({type:'string',value:'fromLocationCode',text:'起始库位',dictCode:''}) + fieldList.push({type:'string',value:'toLocationCode',text:'目标库位',dictCode:''}) + fieldList.push({type:'string',value:'isEmptyOut',text:'是否空出',dictCode:'is_or_not'}) + fieldList.push({type:'int',value:'isDoubleIn',text:'是否重入',dictCode:'is_or_not'}) + fieldList.push({type:'string',value:'originLocationCode',text:'重入库位号',dictCode:''}) + fieldList.push({type:'int',value:'status',text:'任务状态',dictCode:'task_header_status'}) + fieldList.push({type:'string',value:'fromPort',text:'起始出入口',dictCode:''}) + fieldList.push({type:'string',value:'toPort',text:'目标出入口',dictCode:''}) + fieldList.push({type:'string',value:'createBy',text:'创建人',dictCode:''}) + fieldList.push({type:'datetime',value:'createTime',text:'创建日期'}) + fieldList.push({type:'string',value:'updateBy',text:'更新人',dictCode:''}) + fieldList.push({type:'datetime',value:'updateTime',text:'更新日期'}) + this.superFieldList = fieldList + } + } + } +</script> +<style scoped> + @import '~@assets/less/common.less' +</style> \ No newline at end of file diff --git a/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/task/modules/TaskDetailModal.vue b/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/task/modules/TaskDetailModal.vue new file mode 100644 index 0000000..3b0e63f --- /dev/null +++ b/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/task/modules/TaskDetailModal.vue @@ -0,0 +1,158 @@ +<template> + <j-modal + :title="title" + :width="width" + :visible="visible" + :confirmLoading="confirmLoading" + switchFullscreen + @ok="handleOk" + @cancel="handleCancel" + cancelText="关闭"> + <a-spin :spinning="confirmLoading"> + <a-form-model ref="form" :model="model" :rules="validatorRules"> + <a-row> + <a-col :span="24"> + <a-form-model-item label="货主" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="companyCode"> + <a-input v-model="model.companyCode"placeholder="请输入货主" ></a-input> + </a-form-model-item> + </a-col> + <a-col :span="24"> + <a-form-model-item label="物料编码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="materialCode"> + <a-input v-model="model.materialCode"placeholder="请输入物料编码" ></a-input> + </a-form-model-item> + </a-col> + <a-col :span="24"> + <a-form-model-item label="物料名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="materialName"> + <a-input v-model="model.materialName"placeholder="请输入物料名称" ></a-input> + </a-form-model-item> + </a-col> + <a-col :span="24"> + <a-form-model-item label="物料规格" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="materialSpec"> + <a-input v-model="model.materialSpec"placeholder="请输入物料规格" ></a-input> + </a-form-model-item> + </a-col> + <a-col :span="24"> + <a-form-model-item label="物料单位" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="materialUnit"> + <a-input v-model="model.materialUnit"placeholder="请输入物料单位" ></a-input> + </a-form-model-item> + </a-col> + <a-col :span="24"> + <a-form-model-item label="数量" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="qty"> + <a-input-number v-model="model.qty"placeholder="请输入数量" style="width: 100%" /> + </a-form-model-item> + </a-col> + <a-col :span="24"> + <a-form-model-item label="批次" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="batch"> + <a-input v-model="model.batch"placeholder="请输入批次" ></a-input> + </a-form-model-item> + </a-col> + <a-col :span="24"> + <a-form-model-item label="库存状态" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="inventoryStatus"> + <j-dict-select-tag type="list" v-model="model.inventoryStatus" dictCode="inventory_status" placeholder="请选择库存状态" /> + </a-form-model-item> + </a-col> + </a-row> + </a-form-model> + </a-spin> + </j-modal> +</template> + +<script> + + import { httpAction } from '@/api/manage' + import { validateDuplicateValue } from '@/utils/util' + + export default { + name: "TaskDetailModal", + components: { + }, + props:{ + mainId:{ + type:String, + required:false, + default:'' + } + }, + data () { + return { + title:"操作", + width:800, + visible: false, + model:{ + }, + labelCol: { + xs: { span: 24 }, + sm: { span: 5 }, + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 16 }, + }, + + confirmLoading: false, + validatorRules: { + }, + url: { + add: "/task/taskHeader/addTaskDetail", + edit: "/task/taskHeader/editTaskDetail", + } + + } + }, + created () { + //备份model原始值 + this.modelDefault = JSON.parse(JSON.stringify(this.model)); + }, + methods: { + add () { + this.edit(this.modelDefault); + }, + edit (record) { + this.model = Object.assign({}, record); + this.visible = true; + }, + close () { + this.$emit('close'); + this.visible = false; + this.$refs.form.clearValidate(); + }, + handleOk () { + 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'; + } + this.model['taskHeaderId'] = this.mainId + 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; + that.close(); + }) + }else{ + return false + } + }) + }, + handleCancel () { + this.close() + }, + + + } + } +</script> diff --git a/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/task/modules/TaskHeaderModal.vue b/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/task/modules/TaskHeaderModal.vue new file mode 100644 index 0000000..5acf568 --- /dev/null +++ b/jeecg-boot-master/ant-design-vue-jeecg/src/views/system/task/modules/TaskHeaderModal.vue @@ -0,0 +1,160 @@ +<template> + <j-modal + :title="title" + :width="width" + :visible="visible" + :confirmLoading="confirmLoading" + switchFullscreen + @ok="handleOk" + @cancel="handleCancel" + cancelText="关闭"> + <a-spin :spinning="confirmLoading"> + <a-form-model ref="form" :model="model" :rules="validatorRules"> + <a-row> + <a-col :span="24"> + <a-form-model-item label="任务类型" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="taskType"> + <j-dict-select-tag type="list" v-model="model.taskType" dictCode="task_type" placeholder="请选择任务类型" /> + </a-form-model-item> + </a-col> + <a-col :span="24"> + <a-form-model-item label="容器号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="containerCode"> + <a-input v-model="model.containerCode" placeholder="请输入容器号" ></a-input> + </a-form-model-item> + </a-col> + <a-col :span="24"> + <a-form-model-item label="起始库位" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="fromLocationCode"> + <a-input v-model="model.fromLocationCode" placeholder="请输入起始库位" ></a-input> + </a-form-model-item> + </a-col> + <a-col :span="24"> + <a-form-model-item label="目标库位" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="toLocationCode"> + <a-input v-model="model.toLocationCode" placeholder="请输入目标库位" ></a-input> + </a-form-model-item> + </a-col> + <a-col :span="24"> + <a-form-model-item label="是否空出" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="isEmptyOut"> + <j-dict-select-tag type="list" v-model="model.isEmptyOut" dictCode="is_or_not" placeholder="请选择是否空出" /> + </a-form-model-item> + </a-col> + <a-col :span="24"> + <a-form-model-item label="是否重入" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="isDoubleIn"> + <j-dict-select-tag type="list" v-model="model.isDoubleIn" dictCode="is_or_not" placeholder="请选择是否重入" /> + </a-form-model-item> + </a-col> + <a-col :span="24"> + <a-form-model-item label="重入库位号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="originLocationCode"> + <a-input v-model="model.originLocationCode" placeholder="请输入重入库位号" ></a-input> + </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 type="list" v-model="model.status" dictCode="task_header_status" placeholder="请选择任务状态" /> + </a-form-model-item> + </a-col> + <a-col :span="24"> + <a-form-model-item label="起始出入口" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="fromPort"> + <a-input v-model="model.fromPort" placeholder="请输入起始出入口" ></a-input> + </a-form-model-item> + </a-col> + <a-col :span="24"> + <a-form-model-item label="目标出入口" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="toPort"> + <a-input v-model="model.toPort" placeholder="请输入目标出入口" ></a-input> + </a-form-model-item> + </a-col> + </a-row> + </a-form-model> + </a-spin> + </j-modal> +</template> + +<script> + + import { httpAction } from '@/api/manage' + import { validateDuplicateValue } from '@/utils/util' + + export default { + name: "TaskHeaderModal", + components: { + }, + data () { + return { + title:"操作", + width:800, + visible: false, + model:{ + }, + labelCol: { + xs: { span: 24 }, + sm: { span: 5 }, + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 16 }, + }, + + confirmLoading: false, + validatorRules: { + }, + url: { + add: "/task/taskHeader/add", + edit: "/task/taskHeader/edit", + } + + } + }, + created () { + //备份model原始值 + this.modelDefault = JSON.parse(JSON.stringify(this.model)); + }, + methods: { + add () { + this.edit(this.modelDefault); + }, + edit (record) { + this.model = Object.assign({}, record); + this.visible = true; + }, + close () { + this.$emit('close'); + this.visible = false; + this.$refs.form.clearValidate(); + }, + handleOk () { + 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; + that.close(); + }) + }else{ + return false + } + }) + }, + handleCancel () { + this.close() + }, + + + } + } +</script> \ No newline at end of file diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/container/service/IContainerService.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/container/service/IContainerService.java index 497ea08..3bd5b8d 100644 --- a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/container/service/IContainerService.java +++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/container/service/IContainerService.java @@ -15,4 +15,6 @@ public interface IContainerService extends IService<Container> { Result batchAddContainers(Container container, int number); Container getContainerByCode(String containCode, String warehouseCode); + + boolean updateStatus(String containerCode, String status, String wareohuseCode); } diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/container/service/impl/ContainerServiceImpl.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/container/service/impl/ContainerServiceImpl.java index a254623..41f8838 100644 --- a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/container/service/impl/ContainerServiceImpl.java +++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/container/service/impl/ContainerServiceImpl.java @@ -27,8 +27,6 @@ public class ContainerServiceImpl extends ServiceImpl<ContainerMapper, Container @Resource IContainerTypeService containerTypeService; - @Resource - IContainerService containerService; @Override public Result batchAddContainers(Container container, int number) { @@ -47,7 +45,7 @@ public class ContainerServiceImpl extends ServiceImpl<ContainerMapper, Container container1.setWarehouseCode(warehouseCode); containerList.add(container1); } - boolean result = containerService.saveBatch(containerList); + boolean result = this.saveBatch(containerList); if(result) { Result.OK("添加成功!"); } @@ -59,17 +57,28 @@ public class ContainerServiceImpl extends ServiceImpl<ContainerMapper, Container LambdaQueryWrapper<Container> containerLambdaQueryWrapper = Wrappers.lambdaQuery(); containerLambdaQueryWrapper.eq(Container::getCode, containCode) .eq(Container::getWarehouseCode, warehouseCode); - Container container = containerService.getOne(containerLambdaQueryWrapper); + Container container = this.getOne(containerLambdaQueryWrapper); return container; } + @Override + public boolean updateStatus(String containerCode, String status, String wareohuseCode) { + Container container = this.getContainerByCode(containerCode, wareohuseCode); + if(container == null) { + return false; + } + container.setStatus(status); + boolean result = this.updateById(container); + return result; + } + private int getStartNumber(String containerTypeCode, String warehouseCode) { LambdaQueryWrapper<Container> containerLambdaQueryWrapper = Wrappers.lambdaQuery(); containerLambdaQueryWrapper.eq(Container::getContainerTypeCode, containerTypeCode) .eq(Container::getWarehouseCode, warehouseCode) .orderByDesc(Container::getId).last("Limit 1"); - Container container = containerService.getOne(containerLambdaQueryWrapper); + Container container = this.getOne(containerLambdaQueryWrapper); //如果指定类型的最后的code存在,那么 code = 容器类型 + (排序号 + 1) if (container != null && container.getCode() != null) { Integer number = Integer.valueOf(container.getCode().substring(container.getCode().length() - 5, container.getCode().length())); diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/location/service/ILocationService.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/location/service/ILocationService.java index 77a17cc..c306b5e 100644 --- a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/location/service/ILocationService.java +++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/location/service/ILocationService.java @@ -11,4 +11,14 @@ import org.jeecg.modules.wms.config.location.entity.Location; */ public interface ILocationService extends IService<Location> { + Location getLocationByCode(String locationCode, String wareohuseCode); + + boolean updateStatus(String locationCode, String status, String wareohuseCode); + + Location getNear(Location location); + + Location getInsideNear(Location location); + + Location getOutSideNear(Location location); + } diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/location/service/impl/LocationServiceImpl.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/location/service/impl/LocationServiceImpl.java index 6316c03..8332dce 100644 --- a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/location/service/impl/LocationServiceImpl.java +++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/location/service/impl/LocationServiceImpl.java @@ -1,12 +1,18 @@ package org.jeecg.modules.wms.config.location.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import org.jeecg.modules.wms.config.location.entity.Location; import org.jeecg.modules.wms.config.location.mapper.LocationMapper; import org.jeecg.modules.wms.config.location.service.ILocationService; +import org.jeecg.utils.constant.QuantityConstant; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import javax.annotation.Resource; +import java.util.List; + /** * @Description: 库位管理 * @Author: jeecg-boot @@ -16,4 +22,76 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @Service public class LocationServiceImpl extends ServiceImpl<LocationMapper, Location> implements ILocationService { + + @Override + public Location getLocationByCode(String locationCode, String wareohuseCode) { + LambdaQueryWrapper<Location> locationLambdaQueryWrapper = Wrappers.lambdaQuery(); + locationLambdaQueryWrapper.eq(Location::getCode, locationCode) + .eq(Location::getWarehouseCode, wareohuseCode); + Location location = this.getOne(locationLambdaQueryWrapper); + return location; + } + + @Override + public boolean updateStatus(String locationCode, String status, String wareohuseCode) { + Location location = getLocationByCode(locationCode, wareohuseCode); + if(location == null) { + return false; + } + location.setStatus(QuantityConstant.STATUS_LOCATION_LOCK); + boolean result = updateById(location); + return result; + } + + @Override + public Location getNear(Location location) { + int rowFlag = location.getRowFlag(); + Location locaiton1 = null; + if (rowFlag == 1) { + locaiton1 = getInsideNear(location); + } else { + locaiton1 = getOutSideNear(location); + } + return locaiton1; + } + + @Override + public Location getInsideNear(Location location) { + LambdaQueryWrapper<Location> locationLambdaQueryWrapper = Wrappers.lambdaQuery(); + locationLambdaQueryWrapper.eq(Location::getWarehouseCode, location.getWarehouseCode()) + .eq(Location::getZoneCode, location.getZoneCode()) + .eq(Location::getRoadWay, location.getRoadWay()) + .eq(Location::getIcolumn, location.getIcolumn()) + .eq(Location::getLayer, location.getLayer()) + .eq(Location::getLocationTypeCode, location.getLocationTypeCode()) + .eq(Location::getRowFlag, QuantityConstant.ROW_IN); + List<Location> locationList = list(locationLambdaQueryWrapper); + for (Location location1 : locationList) { + int diff = Math.abs(location1.getRow().intValue() - location.getRow().intValue()); + if (diff == 1) { + return location1; + } + } + return null; + } + + @Override + public Location getOutSideNear(Location location) { + LambdaQueryWrapper<Location> locationLambdaQueryWrapper = Wrappers.lambdaQuery(); + locationLambdaQueryWrapper.eq(Location::getWarehouseCode, location.getWarehouseCode()) + .eq(Location::getZoneCode, location.getZoneCode()) + .eq(Location::getRoadWay, location.getRoadWay()) + .eq(Location::getIcolumn, location.getIcolumn()) + .eq(Location::getLayer, location.getLayer()) + .eq(Location::getLocationTypeCode, location.getLocationTypeCode()) + .eq(Location::getRowFlag, QuantityConstant.ROW_OUT); + List<Location> locationList = list(locationLambdaQueryWrapper); + for (Location location1 : locationList) { + int diff = Math.abs(location1.getRow().intValue() - location.getRow().intValue()); + if (diff == 1) { + return location1; + } + } + return null; + } } diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/controller/ReceiptContainerHeaderController.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/controller/ReceiptContainerHeaderController.java index cb0845a..5e651e4 100644 --- a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/controller/ReceiptContainerHeaderController.java +++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/controller/ReceiptContainerHeaderController.java @@ -7,10 +7,12 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.system.base.controller.JeecgController; import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.util.JwtUtil; import org.jeecg.modules.wms.receipt.receiptContainerHeader.entity.ReceiptContaienrDetail; import org.jeecg.modules.wms.receipt.receiptContainerHeader.entity.ReceiptContainerHeader; import org.jeecg.modules.wms.receipt.receiptContainerHeader.service.IReceiptContaienrDetailService; import org.jeecg.modules.wms.receipt.receiptContainerHeader.service.IReceiptContainerHeaderService; +import org.jeecg.modules.wms.receipt.receiving.domain.Receive; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; @@ -290,7 +292,17 @@ public class ReceiptContainerHeaderController extends JeecgController<ReceiptCon /*--------------------------------子表处理-入库组盘详情-end----------------------------------------------*/ - + /** + * 创建任务 + * @return + */ + @ApiOperation(value="入库组盘-创建任务", notes="入库组盘-创建任务") + @PostMapping("/createTask") + @ResponseBody + public Result createTask(@RequestBody ReceiptContainerHeader receiptContainerHeader, HttpServletRequest req) { + String warehouseCode = JwtUtil.getWarehouseCodeByToken(req); + return receiptContainerHeaderService.createTask(receiptContainerHeader, warehouseCode); + } } diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/IReceiptContainerHeaderService.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/IReceiptContainerHeaderService.java index 3f9d51d..78f226e 100644 --- a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/IReceiptContainerHeaderService.java +++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/IReceiptContainerHeaderService.java @@ -1,6 +1,7 @@ package org.jeecg.modules.wms.receipt.receiptContainerHeader.service; import com.baomidou.mybatisplus.extension.service.IService; +import org.jeecg.common.api.vo.Result; import org.jeecg.modules.wms.config.container.entity.Container; import org.jeecg.modules.wms.receipt.receiptContainerHeader.entity.ReceiptContainerHeader; import org.springframework.beans.factory.annotation.Autowired; @@ -27,4 +28,6 @@ public interface IReceiptContainerHeaderService extends IService<ReceiptContaine public void delBatchMain (Collection<? extends Serializable> idList); ReceiptContainerHeader getUnCompleteReceiptContainerByCode(String containerCode, String warehouseCode); + + public Result createTask(ReceiptContainerHeader receiptContainerHeader, String warehouseCode); } diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/impl/ReceiptContainerHeaderServiceImpl.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/impl/ReceiptContainerHeaderServiceImpl.java index 2b44a74..aec94a2 100644 --- a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/impl/ReceiptContainerHeaderServiceImpl.java +++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/impl/ReceiptContainerHeaderServiceImpl.java @@ -1,19 +1,39 @@ package org.jeecg.modules.wms.receipt.receiptContainerHeader.service.impl; +import com.aliyun.oss.ServiceException; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import org.jeecg.common.api.vo.Result; +import org.jeecg.modules.wms.config.container.entity.Container; +import org.jeecg.modules.wms.config.container.service.IContainerService; +import org.jeecg.modules.wms.config.location.entity.Location; +import org.jeecg.modules.wms.config.location.service.ILocationService; +import org.jeecg.modules.wms.receipt.receiptContainerHeader.entity.ReceiptContaienrDetail; import org.jeecg.modules.wms.receipt.receiptContainerHeader.entity.ReceiptContainerHeader; import org.jeecg.modules.wms.receipt.receiptContainerHeader.mapper.ReceiptContaienrDetailMapper; import org.jeecg.modules.wms.receipt.receiptContainerHeader.mapper.ReceiptContainerHeaderMapper; +import org.jeecg.modules.wms.receipt.receiptContainerHeader.service.IReceiptContaienrDetailService; import org.jeecg.modules.wms.receipt.receiptContainerHeader.service.IReceiptContainerHeaderService; +import org.jeecg.modules.wms.receipt.receiptHeader.entity.ReceiptDetail; +import org.jeecg.modules.wms.receipt.receiptHeader.service.IReceiptDetailService; +import org.jeecg.modules.wms.receipt.receiptHeader.service.IReceiptHeaderService; +import org.jeecg.modules.wms.task.taskHeader.entity.TaskDetail; +import org.jeecg.modules.wms.task.taskHeader.entity.TaskHeader; +import org.jeecg.modules.wms.task.taskHeader.service.ITaskDetailService; +import org.jeecg.modules.wms.task.taskHeader.service.ITaskHeaderService; +import org.jeecg.utils.StringUtils; import org.jeecg.utils.constant.QuantityConstant; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; import java.io.Serializable; +import java.util.ArrayList; import java.util.List; import java.util.Collection; +import java.util.stream.Collectors; /** * @Description: 入库组盘 @@ -28,6 +48,22 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContai private ReceiptContainerHeaderMapper receiptContainerHeaderMapper; @Autowired private ReceiptContaienrDetailMapper receiptContaienrDetailMapper; + @Resource + private IContainerService containerService; + @Resource + private IReceiptContaienrDetailService receiptContaienrDetailService; + @Resource + private ILocationService locationService; + @Resource + private IReceiptContainerHeaderService receiptContainerHeaderService; + @Resource + private ITaskHeaderService taskHeaderService; + @Resource + private ITaskDetailService taskDetailService; + @Resource + private IReceiptDetailService receiptDetailService; + @Resource + private IReceiptHeaderService receiptHeaderService; @Override @Transactional @@ -55,4 +91,135 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContai return receiptContainerHeader; } + @Override + @Transactional + public Result createTask(ReceiptContainerHeader receiptContainerHeader, String warehouseCode) { + int id = receiptContainerHeader.getId(); + receiptContainerHeader = this.getById(id); + if (receiptContainerHeader == null) { + return Result.error("id:" + id + "的入库组盘不存在!"); + } + if (!receiptContainerHeader.getWarehouseCode().equals(warehouseCode)) { + return Result.error("id:" + id + "的入库组盘不能在" + warehouseCode + "仓库操作"); + } + String containerCode = receiptContainerHeader.getContainerCode(); + Container container = containerService.getContainerByCode(containerCode, warehouseCode); + if(container.getStatus().equals(QuantityConstant.STATUS_CONTAINER_LOCK)) { + return Result.error("托盘已经锁定,不能生成任务"); + } + LambdaQueryWrapper<ReceiptContaienrDetail> receiptContaienrDetailLambdaQueryWrapper = Wrappers.lambdaQuery(); + receiptContaienrDetailLambdaQueryWrapper.eq(ReceiptContaienrDetail::getReceiptContainerId, receiptContainerHeader.getId()); + List<ReceiptContaienrDetail> receiptContaienrDetailList = + receiptContaienrDetailService.list(receiptContaienrDetailLambdaQueryWrapper); + if(receiptContaienrDetailList.isEmpty()) { + return Result.error("id:" + id + "的入库组盘,没有组盘明细,请先组盘!"); + } + boolean result = containerService.updateStatus(containerCode, + QuantityConstant.STATUS_CONTAINER_LOCK, warehouseCode); + if(!result) { + throw new ServiceException("更新容器状态失败"); + } + String fromLocationCode = receiptContainerHeader.getFromLocationCode(); + String toLocaitonCode = receiptContainerHeader.getToLocationCode(); + if(StringUtils.isNotEmpty(fromLocationCode)) { + result = locationService.updateStatus(fromLocationCode, + QuantityConstant.STATUS_LOCATION_LOCK, warehouseCode); + if(!result) { + throw new ServiceException("更新起始库位状态失败"); + } + } + String zoneCode = null; + if(StringUtils.isNotEmpty(toLocaitonCode)) { + result = locationService.updateStatus(toLocaitonCode, + QuantityConstant.STATUS_LOCATION_LOCK, warehouseCode); + if(!result) { + throw new ServiceException("更新目标库位状态失败"); + } + Location toLocation = locationService.getLocationByCode(toLocaitonCode, warehouseCode); + if(!toLocation.getWarehouseCode().equals(warehouseCode)) { + throw new ServiceException("库位对应的仓库不匹配"); + } + zoneCode = toLocation.getZoneCode(); + //旁边库位有任务 + if (taskHeaderService.haveUncompleteTaskInNear(toLocation)) { + throw new ServiceException("旁边库位任务数大于0"); + } + } + int receiptContainerStatus = receiptContainerHeader.getStatus(); + if(receiptContainerStatus != QuantityConstant.RECEIPT_CONTAINER_BUILD) { + throw new ServiceException("入库组盘状态不是创建状态"); + } + receiptContainerHeader.setStatus(QuantityConstant.RECEIPT_CONTAINER_TASK); + result = receiptContainerHeaderService.updateById(receiptContainerHeader); + if(!result) { + throw new ServiceException("更新入库组盘头状态失败"); + } + TaskHeader taskHeader = new TaskHeader(); + taskHeader.setContainerCode(containerCode); + taskHeader.setTaskType(receiptContainerHeader.getTaskType()); + taskHeader.setInnernalTaskType(QuantityConstant.TASK_INTENERTYPE_RECEIPT); + taskHeader.setFromLocationCode(fromLocationCode); + taskHeader.setToLocationCode(toLocaitonCode); + taskHeader.setStatus(QuantityConstant.TASK_STATUS_BUILD); + taskHeader.setCompanyCode(receiptContainerHeader.getCompanyCode()); + taskHeader.setReceiptContaienrHeaderId(receiptContainerHeader.getId()); + taskHeader.setWarehouseCode(warehouseCode); + taskHeader.setZoneCode(zoneCode); + taskHeader.setToPort(receiptContainerHeader.getToPort()); + result = taskHeaderService.save(taskHeader); + if(!result) { + throw new ServiceException("任务生成失败"); + } + List<TaskDetail> taskDetailList = new ArrayList<>(); + List<ReceiptDetail> receiptDetailList = new ArrayList<>(); + for(ReceiptContaienrDetail receiptContaienrDetail : receiptContaienrDetailList) { + TaskDetail taskDetail = new TaskDetail(); + taskDetail.setTaskHeaderId(taskHeader.getId()); + taskDetail.setTaskType(taskHeader.getTaskType()); + taskDetail.setWarehouseCode(receiptContaienrDetail.getWarehouseCode()); + taskDetail.setReceiptId(receiptContaienrDetail.getReceiptId()); + taskDetail.setReceiptDetailId(receiptContaienrDetail.getReceiptDetailId()); + taskDetail.setReceiptContainerDetailId(receiptContaienrDetail.getId()); + taskDetail.setCompanyCode(receiptContaienrDetail.getCompanyCode()); + taskDetail.setMaterialCode(receiptContaienrDetail.getMaterialCode()); + taskDetail.setMaterialName(receiptContaienrDetail.getMaterialName()); + taskDetail.setMaterialSpec(receiptContaienrDetail.getMaterialSpec()); + taskDetail.setMaterialUnit(receiptContaienrDetail.getMaterialUnit()); + taskDetail.setInventoryStatus(receiptContaienrDetail.getInventoryStatus()); + taskDetail.setQty(receiptContaienrDetail.getQty()); + taskDetail.setBatch(receiptContaienrDetail.getBatch()); + taskDetail.setLot(receiptContaienrDetail.getLot()); + taskDetail.setProject(receiptContaienrDetail.getProject()); + taskDetailList.add(taskDetail); + ReceiptDetail receiptDetail = receiptDetailService.getById(receiptContaienrDetail.getReceiptDetailId()); + if(receiptDetail == null) { + throw new ServiceException("根据id:" + receiptContaienrDetail.getReceiptDetailId() + ",没有找到入库单详情"); + } + receiptDetail.setStatus(QuantityConstant.RECEIPT_HEADER_WAIT_SHELF); + receiptDetailList.add(receiptDetail); + } + result = taskDetailService.saveBatch(taskDetailList); + if(!result) { + throw new ServiceException("任务详情生成失败"); + } + receiptContainerHeader.setStatus(QuantityConstant.RECEIPT_CONTAINER_TASK); + result = this.updateById(receiptContainerHeader); + if(!result) { + throw new ServiceException("生成任务时,更新入库组盘头失败"); + } + result = receiptDetailService.updateBatchById(receiptDetailList); + if(!result) { + throw new ServiceException("更新入库单明细失败"); + } + List<Integer> receiptIdList =receiptDetailList.stream() + .map(ReceiptDetail::getReceiptId).distinct().collect(Collectors.toList()); + for(Integer receiptId : receiptIdList) { + result = receiptHeaderService.updateReceiptHeaderStatus(receiptId); + if (!result) { + throw new ServiceException("更新入库单明细失败"); + } + } + return Result.OK("生成入库任务成功"); + } + } diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/service/IReceiptHeaderService.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/service/IReceiptHeaderService.java index 28158f5..4622705 100644 --- a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/service/IReceiptHeaderService.java +++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/service/IReceiptHeaderService.java @@ -29,4 +29,6 @@ public interface IReceiptHeaderService extends IService<ReceiptHeader> { public Result saveReceiptHeader(ReceiptHeader receiptHeader); public String createCode(String receiptType); + + public boolean updateReceiptHeaderStatus(Integer id); } diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/service/impl/ReceiptHeaderServiceImpl.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/service/impl/ReceiptHeaderServiceImpl.java index 45c5129..b832a82 100644 --- a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/service/impl/ReceiptHeaderServiceImpl.java +++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/service/impl/ReceiptHeaderServiceImpl.java @@ -8,9 +8,11 @@ import org.jeecg.common.util.DateUtils; import org.jeecg.modules.wms.config.receiptType.entity.ReceiptType; import org.jeecg.modules.wms.config.receiptType.service.IReceiptTypeService; import org.jeecg.modules.wms.config.receiptType.service.impl.ReceiptTypeServiceImpl; +import org.jeecg.modules.wms.receipt.receiptHeader.entity.ReceiptDetail; import org.jeecg.modules.wms.receipt.receiptHeader.entity.ReceiptHeader; import org.jeecg.modules.wms.receipt.receiptHeader.mapper.ReceiptDetailMapper; import org.jeecg.modules.wms.receipt.receiptHeader.mapper.ReceiptHeaderMapper; +import org.jeecg.modules.wms.receipt.receiptHeader.service.IReceiptDetailService; import org.jeecg.modules.wms.receipt.receiptHeader.service.IReceiptHeaderService; import org.jeecg.utils.StringUtils; import org.jeecg.utils.constant.QuantityConstant; @@ -41,6 +43,10 @@ public class ReceiptHeaderServiceImpl extends ServiceImpl<ReceiptHeaderMapper, R private ReceiptDetailMapper receiptDetailMapper; @Resource private IReceiptTypeService receiptTypeService; + @Resource + private IReceiptDetailService receiptDetailService; + @Resource + private IReceiptHeaderService receiptHeaderService; @Override @Transactional @@ -112,4 +118,45 @@ public class ReceiptHeaderServiceImpl extends ServiceImpl<ReceiptHeaderMapper, R } return code; } + + /** + * 更新入库单 头状态和尾状态 + * 头状态是单据详情中最大的状态 + * 尾状态是单据详情中最小的状态 + * @param id + * @return + */ + @Override + public boolean updateReceiptHeaderStatus(Integer id) { + LambdaQueryWrapper<ReceiptDetail> receiptDetailLambdaQueryWrapper = Wrappers.lambdaQuery(); + receiptDetailLambdaQueryWrapper.eq(ReceiptDetail::getId, id); + List<ReceiptDetail> receiptDetailList = receiptDetailService.list(receiptDetailLambdaQueryWrapper); + ReceiptHeader receiptHeader = receiptHeaderService.getById(id); + if(receiptHeader == null) { + return false; + } + int minStatus; + int maxStatus; + if(receiptDetailList.size() == 0) { + minStatus = QuantityConstant.RECEIPT_HEADER_BUILD; + maxStatus = QuantityConstant.RECEIPT_HEADER_BUILD; + } else { + minStatus = QuantityConstant.RECEIPT_HEADER_BUILD; + maxStatus = QuantityConstant.RECEIPT_HEADER_BUILD; + for(ReceiptDetail receiptDetail : receiptDetailList) { + int status = receiptDetail.getStatus(); + if (minStatus > status) { + minStatus = status; + } + if (maxStatus < status) { + maxStatus = status; + } + } + } + + receiptHeader.setFirstStatus(maxStatus); + receiptHeader.setLastStatus(minStatus); + boolean result = receiptHeaderService.updateById(receiptHeader); + return result; + } } diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiving/service/impl/ReceiveServiceImpl.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiving/service/impl/ReceiveServiceImpl.java index 7b631ee..9089802 100644 --- a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiving/service/impl/ReceiveServiceImpl.java +++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiving/service/impl/ReceiveServiceImpl.java @@ -52,6 +52,8 @@ public class ReceiveServiceImpl extends ServiceImpl<ReceiveMapper, Receive> imp private IContainerTypeService containerTypeService; @Resource private IReceiptContaienrDetailService receiptContaienrDetailService; + @Resource + private IReceiptHeaderService receiptHeaderService; /** * 1.判断容器是否存在,并且不能被锁定 @@ -140,6 +142,13 @@ public class ReceiveServiceImpl extends ServiceImpl<ReceiveMapper, Receive> imp if(receiptDetail == null) { throw new ServiceException("没有找到入库单详情,id:" + receive.getId()); } + ReceiptHeader receiptHeader = receiptHeaderService.getById(receiptDetail.getReceiptId()); + if(receiptHeader == null) { + throw new ServiceException("没有找到入库单,id:" + receiptDetail.getReceiptId()); + } + if(receiptHeader.getWarehouseCode().equals(warehouseCode)) { + throw new ServiceException("仓库编码不一致,不能操作"); + } String materialCode = receiptDetail.getMaterialCode(); if(StringUtils.isEmpty(materialCode)) { throw new ServiceException("物料编码为空"); @@ -198,7 +207,7 @@ public class ReceiveServiceImpl extends ServiceImpl<ReceiveMapper, Receive> imp throw new ServiceException("保存入库组盘详情失败"); } } - + return Result.OK("收货成功"); } } diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/controller/TaskHeaderController.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/controller/TaskHeaderController.java new file mode 100644 index 0000000..0eb47e1 --- /dev/null +++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/controller/TaskHeaderController.java @@ -0,0 +1,296 @@ +package org.jeecg.modules.wms.task.taskHeader.controller; + +import org.jeecg.common.system.query.QueryGenerator; +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.jeecg.common.api.vo.Result; +import org.jeecg.modules.wms.task.taskHeader.entity.TaskDetail; +import org.jeecg.modules.wms.task.taskHeader.entity.TaskHeader; +import org.jeecg.modules.wms.task.taskHeader.service.ITaskDetailService; +import org.jeecg.modules.wms.task.taskHeader.service.ITaskHeaderService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.springframework.web.servlet.ModelAndView; +import java.util.Arrays; +import org.jeecg.common.util.oConvertUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.apache.shiro.SecurityUtils; +import org.jeecg.common.system.vo.LoginUser; +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + + /** + * @Description: 任务表 + * @Author: jeecg-boot + * @Date: 2022-11-10 + * @Version: V1.0 + */ +@Api(tags="任务表") +@RestController +@RequestMapping("/task/taskHeader") +@Slf4j +public class TaskHeaderController extends JeecgController<TaskHeader, ITaskHeaderService> { + + @Autowired + private ITaskHeaderService taskHeaderService; + + @Autowired + private ITaskDetailService taskDetailService; + + + /*---------------------------------主表处理-begin-------------------------------------*/ + + /** + * 分页列表查询 + * @param taskHeader + * @param pageNo + * @param pageSize + * @param req + * @return + */ + //@AutoLog(value = "任务表-分页列表查询") + @ApiOperation(value="任务表-分页列表查询", notes="任务表-分页列表查询") + @GetMapping(value = "/list") + public Result<IPage<TaskHeader>> queryPageList(TaskHeader taskHeader, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + QueryWrapper<TaskHeader> queryWrapper = QueryGenerator.initQueryWrapper(taskHeader, req.getParameterMap()); + Page<TaskHeader> page = new Page<TaskHeader>(pageNo, pageSize); + IPage<TaskHeader> pageList = taskHeaderService.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 添加 + * @param taskHeader + * @return + */ + @AutoLog(value = "任务表-添加") + @ApiOperation(value="任务表-添加", notes="任务表-添加") + @PostMapping(value = "/add") + public Result<String> add(@RequestBody TaskHeader taskHeader) { + taskHeaderService.save(taskHeader); + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * @param taskHeader + * @return + */ + @AutoLog(value = "任务表-编辑") + @ApiOperation(value="任务表-编辑", notes="任务表-编辑") + @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) + public Result<String> edit(@RequestBody TaskHeader taskHeader) { + taskHeaderService.updateById(taskHeader); + 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) { + taskHeaderService.delMain(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.taskHeaderService.delBatchMain(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 导出 + * @return + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, TaskHeader taskHeader) { + return super.exportXls(request, taskHeader, TaskHeader.class, "任务表"); + } + + /** + * 导入 + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) { + return super.importExcel(request, response, TaskHeader.class); + } + /*---------------------------------主表处理-end-------------------------------------*/ + + + /*--------------------------------子表处理-任务详情-begin----------------------------------------------*/ + /** + * 通过主表ID查询 + * @return + */ + //@AutoLog(value = "任务详情-通过主表ID查询") + @ApiOperation(value="任务详情-通过主表ID查询", notes="任务详情-通过主表ID查询") + @GetMapping(value = "/listTaskDetailByMainId") + public Result<IPage<TaskDetail>> listTaskDetailByMainId(TaskDetail taskDetail, + @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, + HttpServletRequest req) { + QueryWrapper<TaskDetail> queryWrapper = QueryGenerator.initQueryWrapper(taskDetail, req.getParameterMap()); + Page<TaskDetail> page = new Page<TaskDetail>(pageNo, pageSize); + IPage<TaskDetail> pageList = taskDetailService.page(page, queryWrapper); + return Result.OK(pageList); + } + + /** + * 添加 + * @param taskDetail + * @return + */ + @AutoLog(value = "任务详情-添加") + @ApiOperation(value="任务详情-添加", notes="任务详情-添加") + @PostMapping(value = "/addTaskDetail") + public Result<String> addTaskDetail(@RequestBody TaskDetail taskDetail) { + taskDetailService.save(taskDetail); + return Result.OK("添加成功!"); + } + + /** + * 编辑 + * @param taskDetail + * @return + */ + @AutoLog(value = "任务详情-编辑") + @ApiOperation(value="任务详情-编辑", notes="任务详情-编辑") + @RequestMapping(value = "/editTaskDetail", method = {RequestMethod.PUT,RequestMethod.POST}) + public Result<String> editTaskDetail(@RequestBody TaskDetail taskDetail) { + taskDetailService.updateById(taskDetail); + return Result.OK("编辑成功!"); + } + + /** + * 通过id删除 + * @param id + * @return + */ + @AutoLog(value = "任务详情-通过id删除") + @ApiOperation(value="任务详情-通过id删除", notes="任务详情-通过id删除") + @DeleteMapping(value = "/deleteTaskDetail") + public Result<String> deleteTaskDetail(@RequestParam(name="id",required=true) String id) { + taskDetailService.removeById(id); + return Result.OK("删除成功!"); + } + + /** + * 批量删除 + * @param ids + * @return + */ + @AutoLog(value = "任务详情-批量删除") + @ApiOperation(value="任务详情-批量删除", notes="任务详情-批量删除") + @DeleteMapping(value = "/deleteBatchTaskDetail") + public Result<String> deleteBatchTaskDetail(@RequestParam(name="ids",required=true) String ids) { + this.taskDetailService.removeByIds(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); + } + + /** + * 导出 + * @return + */ + @RequestMapping(value = "/exportTaskDetail") + public ModelAndView exportTaskDetail(HttpServletRequest request, TaskDetail taskDetail) { + // Step.1 组装查询条件 + QueryWrapper<TaskDetail> queryWrapper = QueryGenerator.initQueryWrapper(taskDetail, request.getParameterMap()); + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + + // Step.2 获取导出数据 + List<TaskDetail> pageList = taskDetailService.list(queryWrapper); + List<TaskDetail> exportList = null; + + // 过滤选中数据 + String selections = request.getParameter("selections"); + if (oConvertUtils.isNotEmpty(selections)) { + List<String> selectionList = Arrays.asList(selections.split(",")); + exportList = pageList.stream().filter(item -> selectionList.contains(item.getId())).collect(Collectors.toList()); + } else { + exportList = pageList; + } + + // Step.3 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + mv.addObject(NormalExcelConstants.FILE_NAME, "任务详情"); //此处设置的filename无效 ,前端会重更新设置一下 + mv.addObject(NormalExcelConstants.CLASS, TaskDetail.class); + mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("任务详情报表", "导出人:" + sysUser.getRealname(), "任务详情")); + mv.addObject(NormalExcelConstants.DATA_LIST, exportList); + return mv; + } + + /** + * 导入 + * @return + */ + @RequestMapping(value = "/importTaskDetail/{mainId}") + public Result<?> importTaskDetail(HttpServletRequest request, HttpServletResponse response, @PathVariable("mainId") Integer mainId) { + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map<String, MultipartFile> fileMap = multipartRequest.getFileMap(); + for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) { + MultipartFile file = entity.getValue();// 获取上传文件对象 + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(1); + params.setNeedSave(true); + try { + List<TaskDetail> list = ExcelImportUtil.importExcel(file.getInputStream(), TaskDetail.class, params); + for (TaskDetail temp : list) { + temp.setTaskHeaderId(mainId); + } + long start = System.currentTimeMillis(); + taskDetailService.saveBatch(list); + log.info("消耗时间" + (System.currentTimeMillis() - start) + "毫秒"); + return Result.OK("文件导入成功!数据行数:" + list.size()); + } catch (Exception e) { + log.error(e.getMessage(), e); + return Result.error("文件导入失败:" + e.getMessage()); + } finally { + try { + file.getInputStream().close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return Result.error("文件导入失败!"); + } + + /*--------------------------------子表处理-任务详情-end----------------------------------------------*/ + + + + +} diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/entity/TaskDetail.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/entity/TaskDetail.java new file mode 100644 index 0000000..0b7e1c4 --- /dev/null +++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/entity/TaskDetail.java @@ -0,0 +1,143 @@ +package org.jeecg.modules.wms.task.taskHeader.entity; + +import java.io.Serializable; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import org.jeecg.common.aspect.annotation.Dict; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; + +import java.math.BigDecimal; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.UnsupportedEncodingException; + +/** + * @Description: 任务详情 + * @Author: jeecg-boot + * @Date: 2022-11-10 + * @Version: V1.0 + */ +@Data +@TableName("task_detail") +@ApiModel(value="task_detail对象", description="任务详情") +public class TaskDetail implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.AUTO) + @ApiModelProperty(value = "主键") + private Integer id; + /**任务头ID*/ + @ApiModelProperty(value = "任务头ID") + private Integer taskHeaderId; + /**任务类型*/ + @Excel(name = "任务类型", width = 15) + @ApiModelProperty(value = "任务类型") + private Integer taskType; + /**仓库编码*/ + @Excel(name = "仓库编码", width = 15) + @ApiModelProperty(value = "仓库编码") + private String warehouseCode; + /**货主*/ + @Excel(name = "货主", width = 15) + @ApiModelProperty(value = "货主") + private String companyCode; + /**出库单id*/ + @Excel(name = "出库单id", width = 15) + @ApiModelProperty(value = "出库单id") + private Integer shipmentId; + /**出库详情id*/ + @Excel(name = "出库详情id", width = 15) + @ApiModelProperty(value = "出库详情id") + private Integer shipmentDetailId; + /**出库组盘详情id*/ + @Excel(name = "出库组盘详情id", width = 15) + @ApiModelProperty(value = "出库组盘详情id") + private Integer shipmentContainerDetailId; + /**入库单id*/ + @Excel(name = "入库单id", width = 15) + @ApiModelProperty(value = "入库单id") + private Integer receiptId; + /**入库单详情id*/ + @Excel(name = "入库单详情id", width = 15) + @ApiModelProperty(value = "入库单详情id") + private Integer receiptDetailId; + /**入库组盘详情Id*/ + @Excel(name = "入库组盘详情Id", width = 15) + @ApiModelProperty(value = "入库组盘详情Id") + private Integer receiptContainerDetailId; + /**物料编码*/ + @Excel(name = "物料编码", width = 15) + @ApiModelProperty(value = "物料编码") + private String materialCode; + /**物料名称*/ + @Excel(name = "物料名称", width = 15) + @ApiModelProperty(value = "物料名称") + private String materialName; + /**物料规格*/ + @Excel(name = "物料规格", width = 15) + @ApiModelProperty(value = "物料规格") + private String materialSpec; + /**物料单位*/ + @Excel(name = "物料单位", width = 15) + @ApiModelProperty(value = "物料单位") + private String materialUnit; + /**数量*/ + @Excel(name = "数量", width = 15) + @ApiModelProperty(value = "数量") + private BigDecimal qty; + /**批次*/ + @Excel(name = "批次", width = 15) + @ApiModelProperty(value = "批次") + private String batch; + /**批号*/ + @Excel(name = "批号", width = 15) + @ApiModelProperty(value = "批号") + private String lot; + /**项目号*/ + @Excel(name = "项目号", width = 15) + @ApiModelProperty(value = "项目号") + private String project; + /**库存状态*/ + @Excel(name = "库存状态", width = 15) + @Dict(dicCode = "inventory_status") + @ApiModelProperty(value = "库存状态") + private String inventoryStatus; + /**出库的库存详情id*/ + @Excel(name = "出库的库存详情id", width = 15) + @ApiModelProperty(value = "出库的库存详情id") + private Integer fromInventoryDetailId; + /**入库的库存详情id*/ + @Excel(name = "入库的库存详情id", width = 15) + @ApiModelProperty(value = "入库的库存详情id") + private Integer toInventoryDetailId; + /**备用字段1*/ + @Excel(name = "备用字段1", width = 15) + @ApiModelProperty(value = "备用字段1") + private String userdef1; + /**备用字段2*/ + @Excel(name = "备用字段2", width = 15) + @ApiModelProperty(value = "备用字段2") + private String userdef2; + /**备用字段3*/ + @Excel(name = "备用字段3", width = 15) + @ApiModelProperty(value = "备用字段3") + private String userdef3; + /**创建人*/ + @ApiModelProperty(value = "创建人") + private String createBy; + /**创建日期*/ + @ApiModelProperty(value = "创建日期") + private Date createTime; + /**更新人*/ + @ApiModelProperty(value = "更新人") + private String updateBy; + /**更新日期*/ + @ApiModelProperty(value = "更新日期") + private Date updateTime; +} diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/entity/TaskHeader.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/entity/TaskHeader.java new file mode 100644 index 0000000..0d69e0d --- /dev/null +++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/entity/TaskHeader.java @@ -0,0 +1,125 @@ +package org.jeecg.modules.wms.task.taskHeader.entity; + +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import org.jeecgframework.poi.excel.annotation.Excel; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecg.common.aspect.annotation.Dict; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * @Description: 任务表 + * @Author: jeecg-boot + * @Date: 2022-11-10 + * @Version: V1.0 + */ +@Data +@TableName("task_header") +@ApiModel(value="task_header对象", description="任务表") +public class TaskHeader implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.AUTO) + @ApiModelProperty(value = "主键") + private Integer id; + /**前置任务号*/ + @Excel(name = "前置任务号", width = 15) + @ApiModelProperty(value = "前置任务号") + private Integer preTaskNo; + /**前置任务号*/ + @Excel(name = "入库组盘ID", width = 15) + @ApiModelProperty(value = "入库组盘ID") + private Integer receiptContaienrHeaderId; + /**仓库*/ + @Excel(name = "仓库", width = 15) + @ApiModelProperty(value = "仓库") + private String warehouseCode; + /**货主*/ + @Excel(name = "货主", width = 15) + @ApiModelProperty(value = "货主") + private String companyCode; + /**库区*/ + @Excel(name = "库区", width = 15) + @ApiModelProperty(value = "库区") + private String zoneCode; + /**任务类型*/ + @Excel(name = "任务类型", width = 15, dicCode = "task_type") + @Dict(dicCode = "task_type") + @ApiModelProperty(value = "任务类型") + private Integer taskType; + /**内部任务类型*/ + @Excel(name = "内部任务类型", width = 15) + @ApiModelProperty(value = "内部任务类型") + private Integer innernalTaskType; + /**容器号*/ + @Excel(name = "容器号", width = 15) + @ApiModelProperty(value = "容器号") + private String containerCode; + /**起始库位*/ + @Excel(name = "起始库位", width = 15) + @ApiModelProperty(value = "起始库位") + private String fromLocationCode; + /**目标库位*/ + @Excel(name = "目标库位", width = 15) + @ApiModelProperty(value = "目标库位") + private String toLocationCode; + /**是否空出*/ + @Excel(name = "是否空出", width = 15, dicCode = "is_or_not") + @Dict(dicCode = "is_or_not") + @ApiModelProperty(value = "是否空出") + private String isEmptyOut; + /**是否重入*/ + @Excel(name = "是否重入", width = 15, dicCode = "is_or_not") + @Dict(dicCode = "is_or_not") + @ApiModelProperty(value = "是否重入") + private Integer isDoubleIn; + /**重入库位号*/ + @Excel(name = "重入库位号", width = 15) + @ApiModelProperty(value = "重入库位号") + private String originLocationCode; + /**任务状态*/ + @Excel(name = "任务状态", width = 15, dicCode = "task_header_status") + @Dict(dicCode = "task_header_status") + @ApiModelProperty(value = "任务状态") + private Integer status; + /**起始出入口*/ + @Excel(name = "起始出入口", width = 15) + @ApiModelProperty(value = "起始出入口") + private String fromPort; + /**目标出入口*/ + @Excel(name = "目标出入口", width = 15) + @ApiModelProperty(value = "目标出入口") + private String toPort; + /**备用字段1*/ + @Excel(name = "备用字段1", width = 15) + @ApiModelProperty(value = "备用字段1") + private String userdef1; + /**备用字段2*/ + @Excel(name = "备用字段2", width = 15) + @ApiModelProperty(value = "备用字段2") + private String userdef2; + /**备用字段3*/ + @Excel(name = "备用字段3", width = 15) + @ApiModelProperty(value = "备用字段3") + private String userdef3; + /**创建人*/ + @ApiModelProperty(value = "创建人") + private String createBy; + /**创建日期*/ + @ApiModelProperty(value = "创建日期") + private Date createTime; + /**更新人*/ + @ApiModelProperty(value = "更新人") + private String updateBy; + /**更新日期*/ + @ApiModelProperty(value = "更新日期") + private Date updateTime; +} diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/mapper/TaskDetailMapper.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/mapper/TaskDetailMapper.java new file mode 100644 index 0000000..1870b1b --- /dev/null +++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/mapper/TaskDetailMapper.java @@ -0,0 +1,20 @@ +package org.jeecg.modules.wms.task.taskHeader.mapper; + +import java.util.List; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; +import org.jeecg.modules.wms.task.taskHeader.entity.TaskDetail; + +/** + * @Description: 任务详情 + * @Author: jeecg-boot + * @Date: 2022-11-10 + * @Version: V1.0 + */ +public interface TaskDetailMapper extends BaseMapper<TaskDetail> { + + public boolean deleteByMainId(@Param("mainId") String mainId); + + public List<TaskDetail> selectByMainId(@Param("mainId") String mainId); + +} diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/mapper/TaskHeaderMapper.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/mapper/TaskHeaderMapper.java new file mode 100644 index 0000000..40d5b19 --- /dev/null +++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/mapper/TaskHeaderMapper.java @@ -0,0 +1,17 @@ +package org.jeecg.modules.wms.task.taskHeader.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.jeecg.modules.wms.task.taskHeader.entity.TaskHeader; + +/** + * @Description: 任务表 + * @Author: jeecg-boot + * @Date: 2022-11-10 + * @Version: V1.0 + */ +public interface TaskHeaderMapper extends BaseMapper<TaskHeader> { + +} diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/mapper/xml/TaskDetailMapper.xml b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/mapper/xml/TaskDetailMapper.xml new file mode 100644 index 0000000..5972449 --- /dev/null +++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/mapper/xml/TaskDetailMapper.xml @@ -0,0 +1,18 @@ +<?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.task.taskHeader.mapper.TaskDetailMapper"> + + <delete id="deleteByMainId" parameterType="java.lang.String"> + DELETE + FROM task_detail + WHERE + task_header_id = #{mainId} + </delete> + + <select id="selectByMainId" parameterType="java.lang.String" resultType="org.jeecg.modules.wms.task.taskHeader.entity.TaskDetail"> + SELECT * + FROM task_detail + WHERE + task_header_id = #{mainId} + </select> +</mapper> diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/mapper/xml/TaskHeaderMapper.xml b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/mapper/xml/TaskHeaderMapper.xml new file mode 100644 index 0000000..d8179cd --- /dev/null +++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/mapper/xml/TaskHeaderMapper.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.task.taskHeader.mapper.TaskHeaderMapper"> + +</mapper> diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskDetailService.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskDetailService.java new file mode 100644 index 0000000..ca05daa --- /dev/null +++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskDetailService.java @@ -0,0 +1,19 @@ +package org.jeecg.modules.wms.task.taskHeader.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import org.jeecg.modules.wms.config.location.entity.Location; +import org.jeecg.modules.wms.task.taskHeader.entity.TaskDetail; + +import java.util.List; + +/** + * @Description: 任务详情 + * @Author: jeecg-boot + * @Date: 2022-11-10 + * @Version: V1.0 + */ +public interface ITaskDetailService extends IService<TaskDetail> { + + public List<TaskDetail> selectByMainId(String mainId); + +} diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskHeaderService.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskHeaderService.java new file mode 100644 index 0000000..e2e5218 --- /dev/null +++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskHeaderService.java @@ -0,0 +1,30 @@ +package org.jeecg.modules.wms.task.taskHeader.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import org.jeecg.modules.wms.config.location.entity.Location; +import org.jeecg.modules.wms.task.taskHeader.entity.TaskHeader; +import org.springframework.beans.factory.annotation.Autowired; +import java.io.Serializable; +import java.util.Collection; +import java.util.List; + +/** + * @Description: 任务表 + * @Author: jeecg-boot + * @Date: 2022-11-10 + * @Version: V1.0 + */ +public interface ITaskHeaderService extends IService<TaskHeader> { + + /** + * 删除一对多 + */ + public void delMain (String id); + + /** + * 批量删除一对多 + */ + public void delBatchMain (Collection<? extends Serializable> idList); + + public boolean haveUncompleteTaskInNear(Location location); +} diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskDetailServiceImpl.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskDetailServiceImpl.java new file mode 100644 index 0000000..190f77e --- /dev/null +++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskDetailServiceImpl.java @@ -0,0 +1,43 @@ +package org.jeecg.modules.wms.task.taskHeader.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import org.jeecg.modules.wms.config.location.entity.Location; +import org.jeecg.modules.wms.config.location.service.ILocationService; +import org.jeecg.modules.wms.task.taskHeader.entity.TaskDetail; +import org.jeecg.modules.wms.task.taskHeader.entity.TaskHeader; +import org.jeecg.modules.wms.task.taskHeader.mapper.TaskDetailMapper; +import org.jeecg.modules.wms.task.taskHeader.service.ITaskDetailService; +import org.jeecg.modules.wms.task.taskHeader.service.ITaskHeaderService; +import org.jeecg.utils.constant.QuantityConstant; +import org.springframework.stereotype.Service; +import java.util.List; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.annotation.Resource; + +/** + * @Description: 任务详情 + * @Author: jeecg-boot + * @Date: 2022-11-10 + * @Version: V1.0 + */ +@Service +public class TaskDetailServiceImpl extends ServiceImpl<TaskDetailMapper, TaskDetail> implements ITaskDetailService { + + @Autowired + private TaskDetailMapper taskDetailMapper; + @Resource + private ILocationService locationService; + @Resource + private ITaskHeaderService taskHeaderService; + + @Override + public List<TaskDetail> selectByMainId(String mainId) { + return taskDetailMapper.selectByMainId(mainId); + } + + + +} diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java new file mode 100644 index 0000000..77e7c03 --- /dev/null +++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java @@ -0,0 +1,70 @@ +package org.jeecg.modules.wms.task.taskHeader.service.impl; + +import org.jeecg.modules.wms.config.location.entity.Location; +import org.jeecg.modules.wms.config.location.service.ILocationService; +import org.jeecg.modules.wms.task.taskHeader.entity.TaskHeader; +import org.jeecg.modules.wms.task.taskHeader.mapper.TaskDetailMapper; +import org.jeecg.modules.wms.task.taskHeader.mapper.TaskHeaderMapper; +import org.jeecg.modules.wms.task.taskHeader.service.ITaskHeaderService; +import org.jeecg.utils.constant.QuantityConstant; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.io.Serializable; +import java.util.List; +import java.util.Collection; + +/** + * @Description: 任务表 + * @Author: jeecg-boot + * @Date: 2022-11-10 + * @Version: V1.0 + */ +@Service +public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHeader> implements ITaskHeaderService { + + @Autowired + private TaskHeaderMapper taskHeaderMapper; + @Autowired + private TaskDetailMapper taskDetailMapper; + @Resource + private ILocationService locationService; + + @Override + @Transactional + public void delMain(String id) { + taskDetailMapper.deleteByMainId(id); + taskHeaderMapper.deleteById(id); + } + + @Override + @Transactional + public void delBatchMain(Collection<? extends Serializable> idList) { + for(Serializable id:idList) { + taskDetailMapper.deleteByMainId(id.toString()); + taskHeaderMapper.deleteById(id); + } + } + + /** + * 如果库位是锁定的,那么这个库位一定是被某个任务占用。 + * @param location + * @return + */ + @Override + public boolean haveUncompleteTaskInNear(Location location) { + Location location1 = locationService.getNear(location); + if (location1 == null) { + return false; + } + String status = location1.getStatus(); + if(QuantityConstant.STATUS_LOCATION_LOCK.equals(status)) { + return true; + } + return false; + } + +} diff --git a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/utils/constant/QuantityConstant.java b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/utils/constant/QuantityConstant.java index 9df14a7..ab460f1 100644 --- a/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/utils/constant/QuantityConstant.java +++ b/jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/utils/constant/QuantityConstant.java @@ -58,7 +58,7 @@ public class QuantityConstant { public static final Integer RECEIPT_HEADER_POSITION = 240; //等待上架 - public static final Integer RECEIPT_HEADER_WAIT = 280; + public static final Integer RECEIPT_HEADER_WAIT_SHELF = 280; //上架 public static final Integer RECEIPT_HEADER_SHELF = 300;