Commit 79d10fb64a509f58f774213a9fafc43660aaa7bd

Authored by 肖超群
1 parent dddeae2b

1. 增加ERP、MES 的接口处理

Showing 22 changed files with 623 additions and 57 deletions
jeecg-boot-master/ant-design-vue-jeecg/src/api/api.js
... ... @@ -167,6 +167,10 @@ export const listShipmentByShipmentDetailId = (params)=>postAction('/shipment/sh
167 167 export const getInventoryFromShipmentDetail = (params)=>postAction('/shipment/shipmentCombination/getInventoryFromShipmentDetail', params);
168 168 //配盘
169 169 export const combination = (params)=>postAction('/shipment/shipmentCombination/combination', params);
  170 +//回传入库单
  171 +export const backErpReceipt = (params)=>postAction('/receipt/receiptHeader/backErpReceipt', params);
  172 +//回传出库单
  173 +export const backErpShipment = (params)=>postAction('/shipment/shipmentHeader/backErpShipment', params);
170 174  
171 175 // 中转HTTP请求
172 176 export const transitRESTful = {
... ...
jeecg-boot-master/ant-design-vue-jeecg/src/views/system/config/MaterialList.vue
... ... @@ -164,11 +164,6 @@
164 164 dataIndex: 'name'
165 165 },
166 166 {
167   - title:'货主编码',
168   - align:"center",
169   - dataIndex: 'companyCode'
170   - },
171   - {
172 167 title:'规格',
173 168 align:"center",
174 169 dataIndex: 'spec'
... ...
jeecg-boot-master/ant-design-vue-jeecg/src/views/system/receipt/ReceiptHeaderList.vue
... ... @@ -161,13 +161,17 @@
161 161 </template>
162 162  
163 163 <span slot="action" slot-scope="text, record">
164   - <a v-has="'receiptHeader:edit'" @click="handleEdit(record)">编辑</a>
165   - <a-divider type="vertical" />
  164 + <a-popconfirm v-has="'receiptHeader:back'" v-if="record.lastStatus == 800" title="确定回传吗?" @confirm="() => hanleBack(record)">
  165 + <a>回传</a>
  166 + </a-popconfirm>
166 167 <a v-if="record.lastStatus < 800" @click="receive(record)">组盘</a>
167 168 <a-divider type="vertical" />
168 169 <a-dropdown>
169 170 <a class="ant-dropdown-link">更多 <a-icon type="down" /></a>
170 171 <a-menu slot="overlay">
  172 + <a-menu-item v-has="'receiptHeader:edit'">
  173 + <a @click="handleEdit(record)">编辑</a>
  174 + </a-menu-item>
171 175 <a-menu-item v-has="'receiptHeader:delete'">
172 176 <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
173 177 <a>删除</a>
... ... @@ -201,7 +205,7 @@
201 205 import '@/assets/less/TableExpand.less'
202 206 import {getCompanyList} from '@/api/api'
203 207 import {getReceiptTypeList} from '@/api/api'
204   - import {getSupplierList} from '@/api/api'
  208 + import {getSupplierList, backErpReceipt} from '@/api/api'
205 209 import ReceiveModal from "./modules/ReceiveModal";
206 210  
207 211  
... ... @@ -414,6 +418,16 @@
414 418 fieldList.push({type:'datetime',value:'updateTime',text:'更新日期'})
415 419 this.superFieldList = fieldList
416 420 },
  421 + hanleBack(record) {
  422 + backErpReceipt(record).then((res) => {
  423 + if (res.success) {
  424 + this.$message.success(res.message);
  425 + } else {
  426 + that.$message.warning(res.message);
  427 + }
  428 + this.searchQuery();
  429 + });
  430 + },
417 431 loadFrom() {
418 432 getCompanyList().then((res) => {
419 433 if (res.success) {
... ...
jeecg-boot-master/ant-design-vue-jeecg/src/views/system/shipment/ShipmentHeaderList.vue
... ... @@ -166,7 +166,9 @@
166 166 </template>
167 167  
168 168 <span slot="action" slot-scope="text, record">
169   - <a-divider type="vertical" />
  169 + <a-popconfirm v-has="'shipmentHeader:back'" v-if="record.lastStatus == 800" title="确定回传吗?" @confirm="() => hanleBack(record)">
  170 + <a>回传</a>
  171 + </a-popconfirm>
170 172 <a v-if="record.lastStatus < 800" @click="autoShipmentCombine(record)">自动配盘</a>
171 173 <a-divider type="vertical" />
172 174 <a v-has="'shipmentHeader:edit'" @click="handleEdit(record)">编辑</a>
... ... @@ -205,7 +207,7 @@
205 207 import ShipmentDetailList from './ShipmentDetailList'
206 208 import {initDictOptions,filterMultiDictText} from '@/components/dict/JDictSelectUtil'
207 209 import '@/assets/less/TableExpand.less'
208   - import {getCompanyList} from '@/api/api'
  210 + import {getCompanyList, backErpShipment} from '@/api/api'
209 211 import {getShipmentTypeList} from '@/api/api'
210 212 import {getCustomerList} from '@/api/api'
211 213 import {autoCombination} from '@/api/api'
... ... @@ -373,6 +375,16 @@
373 375 this.selectedRowKeys = selectedRowKeys;
374 376 this.selectionRows = selectionRows;
375 377 },
  378 + hanleBack(record) {
  379 + backErpShipment(record).then((res) => {
  380 + if (res.success) {
  381 + this.$message.success(res.message);
  382 + } else {
  383 + that.$message.warning(res.message);
  384 + }
  385 + this.searchQuery();
  386 + });
  387 + },
376 388 loadFrom() {
377 389 getCompanyList().then((res) => {
378 390 if (res.success) {
... ...
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/quartz/entity/QuartzJob.java
... ... @@ -24,9 +24,9 @@ import lombok.Data;
24 24 @TableName("sys_quartz_job")
25 25 public class QuartzJob implements Serializable {
26 26 private static final long serialVersionUID = 1L;
27   -
  27 +
28 28 /**id*/
29   - @TableId(type = IdType.ASSIGN_ID)
  29 + @TableId(type = IdType.AUTO)
30 30 private java.lang.String id;
31 31 /**创建人*/
32 32 private java.lang.String createBy;
... ...
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/api/erp/controller/ErpController.java
... ... @@ -9,12 +9,10 @@ import org.jeecg.common.api.vo.Result;
9 9 import org.jeecg.common.aspect.annotation.AutoLog;
10 10 import org.jeecg.common.system.base.controller.JeecgController;
11 11 import org.jeecg.common.system.util.JwtUtil;
12   -import org.jeecg.modules.wms.api.erp.entity.ErpReceipt;
13   -import org.jeecg.modules.wms.api.erp.entity.ErpReceiptDetail;
14   -import org.jeecg.modules.wms.api.erp.entity.ErpReceiptHeader;
15   -import org.jeecg.modules.wms.api.erp.entity.ErpShipment;
  12 +import org.jeecg.modules.wms.api.erp.entity.*;
16 13 import org.jeecg.modules.wms.api.erp.service.IErpService;
17 14 import org.jeecg.modules.wms.api.wcs.entity.WarecellDomain;
  15 +import org.jeecg.modules.wms.config.material.entity.Material;
18 16 import org.jeecg.modules.wms.framework.aspectj.lang.annotation.ApiLogger;
19 17 import org.jeecg.modules.wms.framework.controller.BaseController;
20 18 import org.jeecg.utils.StringUtils;
... ... @@ -41,13 +39,7 @@ public class ErpController extends BaseController {
41 39 @ApiLogger(apiName = "入库单下发", from="ERP")
42 40 public Result receipt(@RequestBody ErpReceipt erpReceipt, HttpServletRequest req) {
43 41 String warehouseCode = JwtUtil.getWarehouseCodeByToken(req);
44   - Result result = handleMultiProcess("receipt", new JeecgController.MultiProcessListener() {
45   - @Override
46   - public Result doProcess() {
47   - return erpService.receipt(erpReceipt, warehouseCode);
48   - }
49   - });
50   - return result;
  42 + return erpService.receipt(erpReceipt, warehouseCode);
51 43 }
52 44  
53 45 @PostMapping("/cancelReceipt")
... ... @@ -56,13 +48,7 @@ public class ErpController extends BaseController {
56 48 public Result cancelReceipt(@RequestBody Map<String, String> param, HttpServletRequest req) {
57 49 String referCode = param.get("referCode");
58 50 String warehouseCode = JwtUtil.getWarehouseCodeByToken(req);
59   - Result result = handleMultiProcess("cancelReceipt", new JeecgController.MultiProcessListener() {
60   - @Override
61   - public Result doProcess() {
62   - return erpService.cancelReceipt(referCode, warehouseCode);
63   - }
64   - });
65   - return result;
  51 + return erpService.cancelReceipt(referCode, warehouseCode);
66 52 }
67 53  
68 54  
... ... @@ -95,4 +81,27 @@ public class ErpController extends BaseController {
95 81 });
96 82 return result;
97 83 }
  84 +
  85 + @PostMapping("/searchInventory")
  86 + @ResponseBody
  87 + @ApiLogger(apiName = "查询库存", from="ERP")
  88 + public Result searchInventory(@RequestBody InventoryQueryParam inventoryQueryParam, HttpServletRequest req) {
  89 + String warehouseCode = JwtUtil.getWarehouseCodeByToken(req);
  90 + Result result = erpService.searchInventory(inventoryQueryParam);
  91 + return result;
  92 + }
  93 +
  94 + @PostMapping("/addMaterial")
  95 + @ResponseBody
  96 + @ApiLogger(apiName = "增加物料", from="ERP")
  97 + public Result addMaterial(@RequestBody Material material, HttpServletRequest req) {
  98 + String warehouseCode = JwtUtil.getWarehouseCodeByToken(req);
  99 + Result result = handleMultiProcess("addMaterial", new JeecgController.MultiProcessListener() {
  100 + @Override
  101 + public Result doProcess() {
  102 + return erpService.addMaterial(material, warehouseCode);
  103 + }
  104 + });
  105 + return result;
  106 + }
98 107 }
... ...
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/api/erp/entity/ErpBackReceipt.java 0 → 100644
  1 +package org.jeecg.modules.wms.api.erp.entity;
  2 +
  3 +import lombok.Data;
  4 +import org.jeecg.modules.wms.receipt.receiptHeader.entity.ReceiptDetail;
  5 +import org.jeecg.modules.wms.receipt.receiptHeader.entity.ReceiptHeader;
  6 +
  7 +import java.util.List;
  8 +
  9 +/**
  10 + * @author 游杰
  11 + */
  12 +@Data
  13 +public class ErpBackReceipt {
  14 +
  15 + private ReceiptHeader receiptHeader;
  16 + private List<ReceiptDetail> receiptDetailList;
  17 +
  18 +}
... ...
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/api/erp/entity/ErpBackShipment.java 0 → 100644
  1 +package org.jeecg.modules.wms.api.erp.entity;
  2 +
  3 +import lombok.Data;
  4 +import org.jeecg.modules.wms.shipment.shipmentHeader.entity.ShipmentDetail;
  5 +import org.jeecg.modules.wms.shipment.shipmentHeader.entity.ShipmentHeader;
  6 +
  7 +import java.util.List;
  8 +
  9 +@Data
  10 +public class ErpBackShipment {
  11 +
  12 + private ShipmentHeader shipmentHeader;
  13 + private List<ShipmentDetail> shipmentDetailList;
  14 +
  15 +}
... ...
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/api/erp/entity/ErpReceiptDetail.java
... ... @@ -16,6 +16,22 @@ public class ErpReceiptDetail {
16 16 private String materialCode;
17 17  
18 18 /**
  19 + * 物料名称
  20 + */
  21 + private String materialName;
  22 +
  23 + /**
  24 + * 物料规格
  25 + */
  26 + private String materialSpec;
  27 +
  28 + /**
  29 + * 物料单位
  30 + */
  31 + private String materialUnit;
  32 +
  33 +
  34 + /**
19 35 * 单据数量
20 36 */
21 37 private BigDecimal qty;
... ...
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/api/erp/entity/InventorySummary.java 0 → 100644
  1 +package org.jeecg.modules.wms.api.erp.entity;
  2 +
  3 +import lombok.Data;
  4 +
  5 +import java.math.BigDecimal;
  6 +
  7 +@Data
  8 +public class InventorySummary {
  9 +
  10 + /**
  11 + * 物料编码
  12 + */
  13 + private String materialCode;
  14 + /**
  15 + * 仓库
  16 + */
  17 + private String warehouseCode;
  18 + /**
  19 + * 货主
  20 + */
  21 + private String companyCode;
  22 + /**
  23 + * 数量
  24 + */
  25 + private BigDecimal qty;
  26 + /**
  27 + * 锁定数量
  28 + */
  29 + private BigDecimal taskQty;
  30 + /**
  31 + * 可用数量
  32 + */
  33 + private BigDecimal availQty;
  34 +}
... ...
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/api/erp/service/IErpService.java
... ... @@ -4,16 +4,49 @@ import org.jeecg.common.api.vo.Result;
4 4 import org.jeecg.modules.wms.api.erp.entity.ErpReceipt;
5 5 import org.jeecg.modules.wms.api.erp.entity.ErpShipment;
6 6 import org.jeecg.modules.wms.api.erp.entity.InventoryQueryParam;
  7 +import org.jeecg.modules.wms.config.material.entity.Material;
  8 +import org.jeecg.modules.wms.receipt.receiptHeader.entity.ReceiptHeader;
  9 +import org.jeecg.modules.wms.shipment.shipmentHeader.entity.ShipmentHeader;
7 10  
8 11 public interface IErpService {
9 12  
  13 + /**
  14 + * 下发入库单
  15 + */
10 16 public Result receipt(ErpReceipt erpReceipt, String warehouseCode);
11 17  
  18 + /**
  19 + * 取消入库单
  20 + */
12 21 public Result cancelReceipt(String referCode, String warehouseCode);
13 22  
  23 + /**
  24 + * 取消出库单
  25 + */
14 26 public Result shipment(ErpShipment erpShipment, String warehouseCode);
15 27  
  28 + /**
  29 + * 取消出库单
  30 + */
16 31 public Result cancelShipment(String referCode, String warehouseCode);
17 32  
  33 + /**
  34 + * 查询库存
  35 + */
18 36 public Result searchInventory(InventoryQueryParam inventoryQueryParam);
  37 +
  38 + /**
  39 + * 增加物料信息
  40 + */
  41 + public Result addMaterial(Material material, String warehouseCode);
  42 +
  43 + /**
  44 + * 回传入库单
  45 + */
  46 + public Result backReceipt(ReceiptHeader receiptHeader);
  47 +
  48 + /**
  49 + * 回传出库单
  50 + */
  51 + public Result backShipment(ShipmentHeader shipmentHeader);
19 52 }
... ...
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/api/erp/service/impl/ErpServiceImpl.java
1 1 package org.jeecg.modules.wms.api.erp.service.impl;
2 2  
  3 +import com.alibaba.fastjson.JSON;
3 4 import com.aliyun.oss.ServiceException;
4 5 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
5 6 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
6 7 import org.jeecg.common.api.vo.Result;
7 8 import org.jeecg.modules.wms.api.erp.entity.*;
8 9 import org.jeecg.modules.wms.api.erp.service.IErpService;
  10 +import org.jeecg.modules.wms.config.address.service.IAddressService;
9 11 import org.jeecg.modules.wms.config.company.entity.Company;
10 12 import org.jeecg.modules.wms.config.company.service.ICompanyService;
11 13 import org.jeecg.modules.wms.config.material.entity.Material;
... ... @@ -24,12 +26,17 @@ import org.jeecg.modules.wms.shipment.shipmentHeader.service.IShipmentDetailServ
24 26 import org.jeecg.modules.wms.shipment.shipmentHeader.service.IShipmentHeaderService;
25 27 import org.jeecg.utils.StringUtils;
26 28 import org.jeecg.utils.constant.QuantityConstant;
  29 +import org.jeecg.utils.http.OkHttpUtils;
27 30 import org.springframework.stereotype.Service;
28 31 import org.springframework.transaction.annotation.Transactional;
29 32  
30 33 import javax.annotation.Resource;
31 34 import java.math.BigDecimal;
  35 +import java.util.ArrayList;
  36 +import java.util.Comparator;
32 37 import java.util.List;
  38 +import java.util.TreeSet;
  39 +import java.util.stream.Collectors;
33 40  
34 41 /**
35 42 * @author 游杰
... ... @@ -53,10 +60,13 @@ public class ErpServiceImpl implements IErpService {
53 60 private IShipmentDetailService shipmentDetailService;
54 61 @Resource
55 62 private IInventoryDetailService inventoryDetailService;
  63 + @Resource
  64 + private IAddressService addressService;
56 65  
57 66 @Override
58 67 @Transactional(rollbackFor = Exception.class)
59 68 public Result receipt(ErpReceipt erpReceipt, String warehouseCode) {
  69 + boolean success = false;
60 70 if(StringUtils.isEmpty(warehouseCode)) {
61 71 return Result.error("入库单下发,仓库编码为空");
62 72 }
... ... @@ -112,6 +122,9 @@ public class ErpServiceImpl implements IErpService {
112 122 for(ErpReceiptDetail erpReceiptDetail : erpReceiptDetailList) {
113 123 BigDecimal qty = erpReceiptDetail.getQty();
114 124 String materialCode = erpReceiptDetail.getMaterialCode();
  125 + String materialName = erpReceiptDetail.getMaterialName();
  126 + String materialSpec = erpReceiptDetail.getMaterialSpec();
  127 + String materialUnit = erpReceiptDetail.getMaterialUnit();
115 128 String inventoryStatus = erpReceiptDetail.getInventoryStatus();
116 129 String batch = erpReceiptDetail.getBatch();
117 130 String lot = erpReceiptDetail.getLot();
... ... @@ -134,7 +147,17 @@ public class ErpServiceImpl implements IErpService {
134 147 receiptDetail.setQty(qty);
135 148 Material material = materialService.getMaterialByCode(materialCode);
136 149 if(material == null) {
137   - throw new ServiceException("入库单下发, 没有找到物料信息" + materialCode);
  150 + material = new Material();
  151 + material.setCode(materialCode);
  152 + material.setName(materialName);
  153 + material.setWarehouseCode(warehouseCode);
  154 + material.setSpec(materialSpec);
  155 + material.setUnit(materialUnit);
  156 + material.setEnable(QuantityConstant.STATUS_ENABLE);
  157 + success = materialService.save(material);
  158 + if(!success) {
  159 + throw new ServiceException("入库单下发, 保存物料失败");
  160 + }
138 161 }
139 162 receiptDetail.setInventoryStatus(inventoryStatus);
140 163 receiptDetail.setMaterialCode(materialCode);
... ... @@ -144,12 +167,12 @@ public class ErpServiceImpl implements IErpService {
144 167 receiptDetail.setBatch(batch);
145 168 receiptDetail.setLot(lot);
146 169 receiptDetail.setProject(project);
147   - boolean success = receiptDetailService.save(receiptDetail);
  170 + success = receiptDetailService.save(receiptDetail);
148 171 if(!success) {
149 172 throw new ServiceException("入库单下发, 保存入库单详情失败");
150 173 }
151 174 }
152   - boolean success = receiptHeaderService.updateReceiptHeader(receiptHeader.getId());
  175 + success = receiptHeaderService.updateReceiptHeader(receiptHeader.getId());
153 176 if(!success) {
154 177 throw new ServiceException("入库单下发, 更新入库单失败");
155 178 }
... ... @@ -177,6 +200,7 @@ public class ErpServiceImpl implements IErpService {
177 200 }
178 201  
179 202 @Override
  203 + @Transactional(rollbackFor = Exception.class)
180 204 public Result shipment(ErpShipment erpShipment, String warehouseCode) {
181 205 if(StringUtils.isEmpty(warehouseCode)) {
182 206 return Result.error("出库单下发,仓库编码为空");
... ... @@ -317,7 +341,137 @@ public class ErpServiceImpl implements IErpService {
317 341 if(inventoryDetailList.size() == 0) {
318 342 return Result.error("没有找到对应库存");
319 343 }
320   - return Result.ok(inventoryDetailList);
  344 + for(InventoryDetail inventoryDetail: inventoryDetailList){
  345 + BigDecimal numQty = BigDecimal.ZERO;
  346 + BigDecimal numTaskQty = BigDecimal.ZERO;
  347 + for (InventoryDetail t:inventoryDetailList){
  348 + if(inventoryDetail.getWarehouseCode().equals(t.getWarehouseCode()) &&
  349 + inventoryDetail.getCompanyCode().equals(t.getCompanyCode()) &&
  350 + inventoryDetail.getMaterialCode().equals(t.getMaterialCode())){
  351 + numQty = numQty.add(t.getQty());
  352 + numTaskQty = numTaskQty.add(t.getTaskQty());
  353 + inventoryDetail.setQty(numQty);
  354 + inventoryDetail.setTaskQty(numTaskQty);
  355 + }
  356 + }
  357 + }
  358 + List<InventoryDetail> materialSummaryList = new ArrayList<>();
  359 + inventoryDetailList.stream().collect(Collectors.collectingAndThen(
  360 + Collectors.toCollection(() -> new TreeSet<>(
  361 + Comparator.comparing(
  362 + inventoryMaterialSummary ->
  363 + inventoryMaterialSummary.getCompanyCode() + ";" + inventoryMaterialSummary.getMaterialCode() + ";" + inventoryMaterialSummary.getWarehouseCode()))),
  364 + ArrayList::new))
  365 + .forEach(list -> materialSummaryList.add(list));
  366 + List<InventorySummary> inventorySummaryList = new ArrayList<>();
  367 + for(InventoryDetail inventoryDetail : materialSummaryList) {
  368 + InventorySummary inventorySummary = new InventorySummary();
  369 + inventorySummary.setWarehouseCode(inventoryDetail.getWarehouseCode());
  370 + inventorySummary.setCompanyCode(inventoryDetail.getCompanyCode());
  371 + inventorySummary.setMaterialCode(inventoryDetail.getMaterialCode());
  372 + BigDecimal availQty = inventoryDetail.getQty().subtract(inventoryDetail.getTaskQty());
  373 + inventorySummary.setQty(inventoryDetail.getQty());
  374 + inventorySummary.setTaskQty(inventoryDetail.getTaskQty());
  375 + inventorySummary.setAvailQty(availQty);
  376 + inventorySummaryList.add(inventorySummary);
  377 + }
  378 + return Result.ok(inventorySummaryList);
  379 + }
  380 +
  381 + @Override
  382 + @Transactional(rollbackFor = Exception.class)
  383 + public Result addMaterial(Material material, String warehouseCode) {
  384 + if(StringUtils.isEmpty(material.getCode())){
  385 + return Result.error("增加物料失败, 物料编码不能为空!!");
  386 + }
  387 + if(StringUtils.isEmpty(material.getName())){
  388 + return Result.error("增加物料失败, 物料名称不能为空!!");
  389 + }
  390 + if(StringUtils.isEmpty(warehouseCode)){
  391 + return Result.error("增加物料失败, 仓库编码不能为空!!");
  392 + }
  393 +
  394 + Warehouse warehouse = warehouseService.getWarehouseByCode(warehouseCode);
  395 + if(warehouse == null) {
  396 + return Result.error("增加物料失败, 仓库为空!!");
  397 + }
  398 + material.setWarehouseCode(warehouseCode);
  399 + material.setEnable(QuantityConstant.STATUS_ENABLE);
  400 + Material material1 = materialService.getMaterialByCode(material.getCode());
  401 + if(material1 != null) {
  402 + return Result.error("增加物料失败, 物料已经存在!!");
  403 + }
  404 + boolean success = materialService.save(material);
  405 + if(!success) {
  406 + throw new ServiceException("增加物料失败, 保存时报错");
  407 + }
  408 + return Result.error("增加物料成功");
  409 + }
  410 +
  411 + @Override
  412 + public Result backReceipt(ReceiptHeader receiptHeader) {
  413 + if(receiptHeader == null) {
  414 + return Result.error("回传入库单, 入库单为空!!");
  415 + }
  416 + List<ReceiptDetail> receiptDetailList = receiptDetailService.
  417 + selectByMainId(String.valueOf(receiptHeader.getId()));
  418 + if(receiptDetailList.size() == 0) {
  419 + return Result.error("回传入库单, 入库单详情为空!!");
  420 + }
  421 + String url = addressService.getUrlByParam(QuantityConstant.ADDRESS_ERP_BACK_RECEIPT);
  422 + ErpBackReceipt erpBackReceipt = new ErpBackReceipt();
  423 + erpBackReceipt.setReceiptHeader(receiptHeader);
  424 + erpBackReceipt.setReceiptDetailList(receiptDetailList);
  425 + String jsonParam = JSON.toJSONString(erpBackReceipt);
  426 + System.out.println(jsonParam);
  427 + String body = OkHttpUtils.bodypost(url, jsonParam);
  428 + if(StringUtils.isEmpty(body)) {
  429 + throw new ServiceException("接口地址错误或返回为空");
  430 + }
  431 + Result result = JSON.parseObject(body, Result.class);
  432 + if(result.getCode() != QuantityConstant.HTTP_OK) {
  433 + return Result.error(result.getMsg());
  434 + }
  435 + receiptHeader.setFirstStatus(QuantityConstant.RECEIPT_HEADER_RETURN);
  436 + receiptHeader.setLastStatus(QuantityConstant.RECEIPT_HEADER_RETURN);
  437 + boolean success = receiptHeaderService.updateById(receiptHeader);
  438 + if(!success) {
  439 + throw new ServiceException("回传入库单失败, 更新入库单头失败");
  440 + }
  441 + return Result.ok("回传入库单成功");
  442 + }
  443 +
  444 + @Override
  445 + public Result backShipment(ShipmentHeader shipmentHeader) {
  446 + if(shipmentHeader == null) {
  447 + return Result.error("回传出库单, 出库单为空!!");
  448 + }
  449 + List<ShipmentDetail> shipmentDetailList = shipmentDetailService.
  450 + selectByMainId(String.valueOf(shipmentHeader.getId()));
  451 + if(shipmentDetailList.size() == 0) {
  452 + return Result.error("回传出库单, 出库单详情为空!!");
  453 + }
  454 + String url = addressService.getUrlByParam(QuantityConstant.ADDRESS_ERP_BACK_SHIPMENT);
  455 + ErpBackShipment erpBackShipment = new ErpBackShipment();
  456 + erpBackShipment.setShipmentHeader(shipmentHeader);
  457 + erpBackShipment.setShipmentDetailList(shipmentDetailList);
  458 + String jsonParam = JSON.toJSONString(erpBackShipment);
  459 + System.out.println(jsonParam);
  460 + String body = OkHttpUtils.bodypost(url, jsonParam);
  461 + if(StringUtils.isEmpty(body)) {
  462 + throw new ServiceException("接口地址错误或返回为空");
  463 + }
  464 + Result result = JSON.parseObject(body, Result.class);
  465 + if(result.getCode() != QuantityConstant.HTTP_OK) {
  466 + return Result.error(result.getMsg());
  467 + }
  468 + shipmentHeader.setFirstStatus(QuantityConstant.SHIPMENT_HEADER_RETURN);
  469 + shipmentHeader.setLastStatus(QuantityConstant.SHIPMENT_HEADER_RETURN);
  470 + boolean success = shipmentHeaderService.updateById(shipmentHeader);
  471 + if(!success) {
  472 + throw new ServiceException("回传出库单失败, 更新出库单头失败");
  473 + }
  474 + return Result.ok("回传出库单成功");
321 475 }
322 476  
323 477  
... ...
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/api/mes/controller/MesController.java 0 → 100644
  1 +package org.jeecg.modules.wms.api.mes.controller;
  2 +
  3 +import org.jeecg.common.api.vo.Result;
  4 +import org.jeecg.common.system.base.controller.JeecgController;
  5 +import org.jeecg.common.system.util.JwtUtil;
  6 +import org.jeecg.modules.wms.api.erp.entity.ErpReceipt;
  7 +import org.jeecg.modules.wms.api.erp.entity.ErpShipment;
  8 +import org.jeecg.modules.wms.api.erp.entity.InventoryQueryParam;
  9 +import org.jeecg.modules.wms.api.erp.service.IErpService;
  10 +import org.jeecg.modules.wms.framework.aspectj.lang.annotation.ApiLogger;
  11 +import org.jeecg.modules.wms.framework.controller.BaseController;
  12 +import org.springframework.web.bind.annotation.*;
  13 +
  14 +import javax.annotation.Resource;
  15 +import javax.servlet.http.HttpServletRequest;
  16 +import java.util.Map;
  17 +
  18 +/**
  19 + * @author 游杰
  20 + */
  21 +@RestController
  22 +@RequestMapping("/API/WMS/mes")
  23 +public class MesController extends BaseController {
  24 +
  25 + @Resource
  26 + private IErpService erpService;
  27 +
  28 + @PostMapping("/receipt")
  29 + @ResponseBody
  30 + @ApiLogger(apiName = "入库单下发", from="ERP")
  31 + public Result receipt(@RequestBody ErpReceipt erpReceipt, HttpServletRequest req) {
  32 + String warehouseCode = JwtUtil.getWarehouseCodeByToken(req);
  33 + return erpService.receipt(erpReceipt, warehouseCode);
  34 + }
  35 +
  36 + @PostMapping("/cancelReceipt")
  37 + @ResponseBody
  38 + @ApiLogger(apiName = "取消入库单", from="ERP")
  39 + public Result cancelReceipt(@RequestBody Map<String, String> param, HttpServletRequest req) {
  40 + String referCode = param.get("referCode");
  41 + String warehouseCode = JwtUtil.getWarehouseCodeByToken(req);
  42 + return erpService.cancelReceipt(referCode, warehouseCode);
  43 + }
  44 +
  45 +
  46 + @PostMapping("/shipment")
  47 + @ResponseBody
  48 + @ApiLogger(apiName = "出库单下发", from="ERP")
  49 + public Result shipment(@RequestBody ErpShipment erpShipment, HttpServletRequest req) {
  50 + String warehouseCode = JwtUtil.getWarehouseCodeByToken(req);
  51 + Result result = handleMultiProcess("shipment", new JeecgController.MultiProcessListener() {
  52 + @Override
  53 + public Result doProcess() {
  54 + return erpService.shipment(erpShipment, warehouseCode);
  55 + }
  56 + });
  57 + return result;
  58 + }
  59 +
  60 +
  61 + @PostMapping("/cancelShipment")
  62 + @ResponseBody
  63 + @ApiLogger(apiName = "取消出库单", from="ERP")
  64 + public Result cancelShipment(@RequestBody Map<String, String> param, HttpServletRequest req) {
  65 + String referCode = param.get("referCode");
  66 + String warehouseCode = JwtUtil.getWarehouseCodeByToken(req);
  67 + Result result = handleMultiProcess("cancelShipment", new JeecgController.MultiProcessListener() {
  68 + @Override
  69 + public Result doProcess() {
  70 + return erpService.cancelShipment(referCode, warehouseCode);
  71 + }
  72 + });
  73 + return result;
  74 + }
  75 +
  76 + @PostMapping("/searchInventory")
  77 + @ResponseBody
  78 + @ApiLogger(apiName = "查询库存", from="ERP")
  79 + public Result searchInventory(@RequestBody InventoryQueryParam inventoryQueryParam, HttpServletRequest req) {
  80 + Result result = erpService.searchInventory(inventoryQueryParam);
  81 + return result;
  82 + }
  83 +
  84 +
  85 +}
... ...
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/api/mes/entity/MesMaterial.java 0 → 100644
  1 +package org.jeecg.modules.wms.api.mes.entity;
  2 +
  3 +import java.math.BigDecimal;
  4 +
  5 +public class MesMaterial {
  6 +
  7 + private String materialCode;
  8 + private BigDecimal qty;
  9 +
  10 +
  11 +}
... ...
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/api/wcs/service/WcsServiceImpl.java
... ... @@ -368,18 +368,12 @@ public class WcsServiceImpl implements WcsService {
368 368 throw new ServiceException("下发任务时,容器没有找到");
369 369 }
370 370  
371   -// String zoneCode = container.getZoneCode();
372   -// if(StringUtils.isEmpty(zoneCode)) {
373   -// throw new ServiceException("下发任务时,库区编码为空");
374   -// }
375 371 String value = parameterConfigurationService.getValueByCode(QuantityConstant.RULE_CONNECT_WCS);
376 372 if(StringUtils.isEmpty(value)) {
377 373 throw new ServiceException("下发任务时,没有找到连接WCS的数据配置");
378 374 }
379 375 int connectWCS = Integer.parseInt(value);
380 376 if (connectWCS == QuantityConstant.RULE_WCS_CONNECT) {
381   -// String url = addressService.getUrlByParam(QuantityConstant.ADDRESS_WCS_TASK_ASSIGN,
382   -// warehouseCode, zoneCode);
383 377 String url = addressService.getUrlByParam(QuantityConstant.ADDRESS_WCS_TASK_ASSIGN);
384 378 wcsTask = switchTaskTypeToWcs(wcsTask);
385 379 String jsonParam = JSON.toJSONString(wcsTask);
... ... @@ -389,7 +383,7 @@ public class WcsServiceImpl implements WcsService {
389 383 throw new ServiceException("接口地址错误或返回为空");
390 384 }
391 385 Result result = JSON.parseObject(body, Result.class);
392   - if(result.getCode() == QuantityConstant.HTTP_OK) {
  386 + if(result.getCode() != QuantityConstant.HTTP_OK) {
393 387 return Result.error(result.getMsg());
394 388 }
395 389 }
... ...
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/material/entity/Material.java
... ... @@ -111,7 +111,7 @@ public class Material implements Serializable {
111 111 @Excel(name = "可用状态", width = 15, dicCode = "enable_status")
112 112 @Dict(dicCode = "enable_status")
113 113 @ApiModelProperty(value = "可用状态")
114   - private String enable;
  114 + private Integer enable;
115 115 /**创建人*/
116 116 @ApiModelProperty(value = "创建人")
117 117 private String createBy;
... ...
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/monitor/job/ErpTask.java 0 → 100644
  1 +package org.jeecg.modules.wms.monitor.job;
  2 +
  3 +import com.baomidou.mybatisplus.core.conditions.Wrapper;
  4 +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  5 +import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  6 +import lombok.extern.slf4j.Slf4j;
  7 +import org.apache.commons.collections.MapUtils;
  8 +import org.jeecg.modules.wms.api.erp.service.IErpService;
  9 +import org.jeecg.modules.wms.receipt.receiptHeader.entity.ReceiptHeader;
  10 +import org.jeecg.modules.wms.receipt.receiptHeader.service.IReceiptHeaderService;
  11 +import org.jeecg.modules.wms.shipment.shipmentHeader.entity.ShipmentHeader;
  12 +import org.jeecg.modules.wms.shipment.shipmentHeader.service.IShipmentHeaderService;
  13 +import org.jeecg.utils.constant.QuantityConstant;
  14 +import org.quartz.Job;
  15 +import org.quartz.JobExecutionContext;
  16 +import org.quartz.JobExecutionException;
  17 +
  18 +import javax.annotation.Resource;
  19 +import java.util.HashMap;
  20 +import java.util.List;
  21 +import java.util.Map;
  22 +
  23 +/**
  24 + * 定时回传ERP
  25 + * @author 游杰
  26 + */
  27 +
  28 +@Slf4j
  29 +public class ErpTask implements Job {
  30 +
  31 + @Resource
  32 + private IReceiptHeaderService receiptHeaderService;
  33 + @Resource
  34 + private IShipmentHeaderService shipmentHeaderService;
  35 + @Resource
  36 + private IErpService erpService;
  37 + //并发控制
  38 + Map<String, Boolean> runningTaskMap = new HashMap<>();
  39 +
  40 + @Override
  41 + public void execute(JobExecutionContext context) throws JobExecutionException {
  42 + String taskKey = "erpBack";
  43 + if(MapUtils.getBoolean(runningTaskMap, taskKey, false)) {
  44 + return;
  45 + }
  46 + try {
  47 + runningTaskMap.put(taskKey, true);
  48 + LambdaQueryWrapper<ReceiptHeader> receiptHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
  49 + receiptHeaderLambdaQueryWrapper.eq(ReceiptHeader::getFirstStatus, QuantityConstant.RECEIPT_HEADER_COMPLETED)
  50 + .eq(ReceiptHeader::getLastStatus, QuantityConstant.RECEIPT_HEADER_COMPLETED);
  51 + List<ReceiptHeader> receiptHeaderList = receiptHeaderService.list(receiptHeaderLambdaQueryWrapper);
  52 + for (ReceiptHeader receiptHeader : receiptHeaderList) {
  53 + try {
  54 + erpService.backReceipt(receiptHeader);
  55 + } catch (Exception e) {
  56 + e.printStackTrace();
  57 + }
  58 + }
  59 +
  60 + LambdaQueryWrapper<ShipmentHeader> shipmentHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
  61 + shipmentHeaderLambdaQueryWrapper.eq(ShipmentHeader::getFirstStatus, QuantityConstant.RECEIPT_HEADER_COMPLETED)
  62 + .eq(ShipmentHeader::getLastStatus, QuantityConstant.RECEIPT_HEADER_COMPLETED);
  63 + List<ShipmentHeader> shipmentHeaderList = shipmentHeaderService.list(shipmentHeaderLambdaQueryWrapper);
  64 + for (ShipmentHeader shipmentHeader : shipmentHeaderList) {
  65 + try {
  66 + erpService.backShipment(shipmentHeader);
  67 + } catch (Exception e) {
  68 + e.printStackTrace();
  69 + }
  70 + }
  71 + } catch (Exception e) {
  72 + e.printStackTrace();
  73 + } finally {
  74 + runningTaskMap.put(taskKey, false);
  75 + }
  76 + }
  77 +}
... ...
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/monitor/job/RyTask.java 0 → 100644
  1 +package org.jeecg.modules.wms.monitor.job;
  2 +
  3 +
  4 +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  5 +import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  6 +import lombok.extern.slf4j.Slf4j;
  7 +import org.apache.commons.collections.MapUtils;
  8 +import org.jeecg.common.util.DateUtils;
  9 +import org.jeecg.modules.wms.task.taskHeader.entity.TaskHeader;
  10 +import org.jeecg.modules.wms.task.taskHeader.service.ITaskHeaderService;
  11 +import org.jeecg.utils.constant.QuantityConstant;
  12 +import org.quartz.Job;
  13 +import org.quartz.JobExecutionContext;
  14 +import org.quartz.JobExecutionException;
  15 +
  16 +import javax.annotation.Resource;
  17 +import java.util.HashMap;
  18 +import java.util.List;
  19 +import java.util.Map;
  20 +
  21 +/**
  22 + * 定时任务
  23 + */
  24 +
  25 +@Slf4j
  26 +public class RyTask implements Job {
  27 +
  28 + //并发控制
  29 + Map<String, Boolean> runningTaskMap = new HashMap<>();
  30 + @Resource
  31 + private ITaskHeaderService taskHeaderService;
  32 +
  33 + @Override
  34 + public void execute(JobExecutionContext context) throws JobExecutionException {
  35 + log.info(String.format(" Jeecg-Boot 执行任务! 时间:" + DateUtils.getTimestamp()));
  36 + String taskKey = "executeTask";
  37 + if(MapUtils.getBoolean(runningTaskMap, taskKey, false)) {
  38 + return;
  39 + }
  40 + try {
  41 + runningTaskMap.put(taskKey, true);
  42 + LambdaQueryWrapper<TaskHeader> taskHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
  43 + taskHeaderLambdaQueryWrapper.eq(TaskHeader::getStatus, QuantityConstant.TASK_STATUS_BUILD);
  44 + List<TaskHeader> taskHeaderList = taskHeaderService.list(taskHeaderLambdaQueryWrapper);
  45 + for(TaskHeader taskHeader : taskHeaderList) {
  46 + try {
  47 + taskHeaderService.sendTaskToWcs(taskHeader.getId());
  48 + } catch (Exception e) {
  49 + e.printStackTrace();
  50 + }
  51 + }
  52 + } catch (Exception e) {
  53 + e.printStackTrace();
  54 + } finally {
  55 + runningTaskMap.put(taskKey, false);
  56 + }
  57 + }
  58 +}
... ...
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/controller/ReceiptHeaderController.java
... ... @@ -10,6 +10,7 @@ import lombok.extern.slf4j.Slf4j;
10 10 import org.jeecg.common.system.base.controller.JeecgController;
11 11 import org.jeecg.common.api.vo.Result;
12 12 import org.jeecg.common.system.util.JwtUtil;
  13 +import org.jeecg.modules.wms.api.erp.service.IErpService;
13 14 import org.jeecg.modules.wms.config.material.entity.Material;
14 15 import org.jeecg.modules.wms.config.material.service.IMaterialService;
15 16 import org.jeecg.modules.wms.receipt.receiptHeader.entity.ReceiptDetail;
... ... @@ -67,6 +68,8 @@ public class ReceiptHeaderController extends JeecgController&lt;ReceiptHeader, IRec
67 68 private IReceiptDetailService receiptDetailService;
68 69 @Resource
69 70 private IMaterialService materialService;
  71 + @Resource
  72 + private IErpService erpService;
70 73  
71 74  
72 75 /*---------------------------------主表处理-begin-------------------------------------*/
... ... @@ -335,5 +338,17 @@ public class ReceiptHeaderController extends JeecgController&lt;ReceiptHeader, IRec
335 338  
336 339 /*--------------------------------子表处理-入库单详情-end----------------------------------------------*/
337 340  
338   -
  341 + /**
  342 + * 回传入库单
  343 + * @param receiptHeader
  344 + * @return
  345 + */
  346 + @AutoLog(value = "回传入库单")
  347 + @ApiOperation(value="回传入库单", notes="回传入库单")
  348 + @RequiresPermissions("receiptHeader:back")
  349 + @RequestMapping(value = "/backErpReceipt", method = {RequestMethod.PUT,RequestMethod.POST})
  350 + public Result<String> backErpReceipt(@RequestBody ReceiptHeader receiptHeader) {
  351 + Result result = erpService.backReceipt(receiptHeader);
  352 + return result;
  353 + }
339 354 }
... ...
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/shipment/shipmentHeader/controller/ShipmentHeaderController.java
... ... @@ -10,6 +10,7 @@ import lombok.extern.slf4j.Slf4j;
10 10 import org.jeecg.common.system.base.controller.JeecgController;
11 11 import org.jeecg.common.api.vo.Result;
12 12 import org.jeecg.common.system.util.JwtUtil;
  13 +import org.jeecg.modules.wms.api.erp.service.IErpService;
13 14 import org.jeecg.modules.wms.receipt.receiptHeader.entity.ReceiptDetail;
14 15 import org.jeecg.modules.wms.receipt.receiptHeader.entity.ReceiptHeader;
15 16 import org.jeecg.modules.wms.shipment.shipmentHeader.entity.ShipmentDetail;
... ... @@ -20,6 +21,8 @@ import org.jeecg.utils.StringUtils;
20 21 import org.jeecg.utils.constant.QuantityConstant;
21 22 import org.springframework.beans.factory.annotation.Autowired;
22 23 import org.springframework.web.bind.annotation.*;
  24 +
  25 +import javax.annotation.Resource;
23 26 import javax.servlet.http.HttpServletRequest;
24 27 import javax.servlet.http.HttpServletResponse;
25 28 import org.springframework.web.servlet.ModelAndView;
... ... @@ -59,6 +62,8 @@ public class ShipmentHeaderController extends JeecgController&lt;ShipmentHeader, IS
59 62  
60 63 @Autowired
61 64 private IShipmentDetailService shipmentDetailService;
  65 + @Resource
  66 + private IErpService erpService;
62 67  
63 68  
64 69 /*---------------------------------主表处理-begin-------------------------------------*/
... ... @@ -327,5 +332,17 @@ public class ShipmentHeaderController extends JeecgController&lt;ShipmentHeader, IS
327 332  
328 333  
329 334  
330   -
  335 + /**
  336 + * 回传出库单
  337 + * @param shipmentHeader
  338 + * @return
  339 + */
  340 + @AutoLog(value = "回传出库单")
  341 + @ApiOperation(value="回传出库单", notes="回传出库单")
  342 + @RequiresPermissions("shipmentHeader:back")
  343 + @RequestMapping(value = "/backErpShipment", method = {RequestMethod.PUT,RequestMethod.POST})
  344 + public Result<String> backErpShipment(@RequestBody ShipmentHeader shipmentHeader) {
  345 + Result result = erpService.backShipment(shipmentHeader);
  346 + return result;
  347 + }
331 348 }
... ...
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/controller/TaskHeaderController.java
... ... @@ -382,20 +382,18 @@ public class TaskHeaderController extends JeecgController&lt;TaskHeader, ITaskHeade
382 382 @PostMapping( "/execute")
383 383 @RequiresPermissions("taskHeader:executeTask")
384 384 public Result execute(@RequestBody TaskHeader taskHeader) {
385   - {
386   - if (taskHeader == null) {
387   - return Result.error("taskHeader不能为空");
388   - }
389   - Integer taskId = taskHeader.getId();
390   - Result result = handleMultiProcess("execute", new MultiProcessListener() {
391   - @Override
392   - public Result doProcess() {
393   - Result result = taskHeaderService.sendTaskToWcs(taskId);
394   - return result;
395   - }
396   - });
397   - return result;
  385 + if (taskHeader == null) {
  386 + return Result.error("taskHeader不能为空");
398 387 }
  388 + Integer taskId = taskHeader.getId();
  389 + Result result = handleMultiProcess("execute", new MultiProcessListener() {
  390 + @Override
  391 + public Result doProcess() {
  392 + Result result = taskHeaderService.sendTaskToWcs(taskId);
  393 + return result;
  394 + }
  395 + });
  396 + return result;
399 397 }
400 398  
401 399 /**
... ...
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/utils/constant/QuantityConstant.java
... ... @@ -426,6 +426,13 @@ public class QuantityConstant {
426 426 public static final String ADDRESS_AGV_TASK_UPDATE = "AGV_TASK_UPDATE";
427 427  
428 428 //ERP
  429 +
  430 + //回传ERP入库单
  431 + public static final String ADDRESS_ERP_BACK_RECEIPT = "ERP_BACK_RECEIPT";
  432 + //回传ERP出库单
  433 + public static final String ADDRESS_ERP_BACK_SHIPMENT = "ERP_BACK_SHIPMENT";
  434 +
  435 +
429 436 public static final String PLATFORM_CODING = "赋码系统";
430 437 public static final String PLATFORM_ERP = "ERP";
431 438 public static final String PLATFORM_WMS = "WMS";
... ...