From 41326b3129ae3e4ef7a45bc16dba64dc9dd27404 Mon Sep 17 00:00:00 2001
From: whycq <10027870+whycq@user.noreply.gitee.com>
Date: 星期三, 04 九月 2024 09:58:14 +0800
Subject: [PATCH] Merge branch 'phyzasrs' of http://47.97.1.152:5880/r/zy-asrs into phyzasrs-erp
---
src/main/java/com/zy/asrs/controller/OpenController.java | 22 +
src/main/java/com/zy/asrs/entity/param/MesPakoutReportParam.java | 39 +++
src/main/java/com/zy/asrs/task/AutoMoveScheduler.java | 4
src/main/java/com/zy/asrs/controller/AgvWrkMastController.java | 3
src/main/java/com/zy/asrs/entity/param/MesPakinReportParam.java | 41 +++
src/main/java/com/zy/asrs/service/OpenService.java | 5
src/main/java/com/zy/asrs/controller/AgvIoWorkController.java | 2
src/main/webapp/views/order/order.html | 2
src/main/java/com/zy/asrs/task/handler/AgvWrkMastHandler.java | 316 +++++++++++++++++++++++++
src/main/java/com/zy/asrs/entity/param/MesBuyPakinReportParam.java | 53 ++++
src/main/java/com/zy/asrs/entity/param/CheckParam.java | 13 +
src/main/webapp/static/js/order/order.js | 7
src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java | 7
src/main/java/com/zy/common/model/DetlDto.java | 2
src/main/java/com/zy/asrs/entity/param/MesOrderReportParam.java | 89 +++++++
src/main/webapp/static/js/agvLocMast/locMast.js | 2
src/main/java/com/zy/asrs/entity/param/OrderSyncParam.java | 8
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java | 55 ++++
src/main/java/com/zy/asrs/task/handler/AutoMoveHandler.java | 3
src/main/resources/application.yml | 13
20 files changed, 656 insertions(+), 30 deletions(-)
diff --git a/src/main/java/com/zy/asrs/controller/AgvIoWorkController.java b/src/main/java/com/zy/asrs/controller/AgvIoWorkController.java
index 950acd4..925a0c7 100644
--- a/src/main/java/com/zy/asrs/controller/AgvIoWorkController.java
+++ b/src/main/java/com/zy/asrs/controller/AgvIoWorkController.java
@@ -121,7 +121,7 @@
return null;
}
- int floor = Integer.parseInt(sourceLocNo.split("@")[1]);
+ int floor = Integer.parseInt(sourceLocNo.split("F")[1]);
List<String> locNoList = agvLocMastService.queryGroupEmptyStock(floor);
diff --git a/src/main/java/com/zy/asrs/controller/AgvWrkMastController.java b/src/main/java/com/zy/asrs/controller/AgvWrkMastController.java
index 4a7d056..b6e2b87 100644
--- a/src/main/java/com/zy/asrs/controller/AgvWrkMastController.java
+++ b/src/main/java/com/zy/asrs/controller/AgvWrkMastController.java
@@ -54,7 +54,8 @@
}else {
wrapper.orderBy("io_time", false);
}
- return R.ok(agvWrkMastService.selectPage(new Page<>(curr, limit), wrapper));
+ Page<AgvWrkMast> agvWrkMastPage = agvWrkMastService.selectPage(new Page<>(curr, limit), wrapper);
+ return R.ok(agvWrkMastPage);
}
@RequestMapping(value = "/wrkMast/list/auth/dbList")
diff --git a/src/main/java/com/zy/asrs/controller/OpenController.java b/src/main/java/com/zy/asrs/controller/OpenController.java
index 1e2b75c..85a52f7 100644
--- a/src/main/java/com/zy/asrs/controller/OpenController.java
+++ b/src/main/java/com/zy/asrs/controller/OpenController.java
@@ -110,7 +110,7 @@
return R.parse(BaseRes.PARAM);
}
- String docName = param.getChildren().get(0).getIQuantity() > 0 ? "閾跺骇閲囪喘鍏ュ簱鍗�" : "閾跺骇閲囪喘閫�璐у崟";
+ String docName = !Cools.isEmpty(param.getOrderType()) ? param.getOrderType() : param.getChildren().get(0).getIQuantity() > 0 ? "閾跺骇閲囪喘鍏ュ簱鍗�" : "閾跺骇閲囪喘閫�璐у崟";
boolean pakin = param.getChildren().get(0).getIQuantity() > 0 ? true : false;
openService.syncOrder(param,pakin,docName);
@@ -119,6 +119,26 @@
}
+ /*
+ 鐩樼偣鎺ュ彛
+ */
+ @PostMapping("/check/default/v1")
+ @AppAuth(memo = "搴撳瓨鐩樼偣")
+ public synchronized R checkLoc(@RequestHeader(required = false) String appkey,
+ @RequestBody(required = true) CheckParam param,
+ HttpServletRequest request){
+ auth(appkey, param, request);
+ if (Cools.isEmpty(param)) {
+ return R.parse(BaseRes.PARAM);
+ }
+
+ openService.checkAndAdjustLocDetl(param);
+
+ return R.ok("搴撳瓨璋冩暣鎴愬姛");
+
+ }
+
+
@PostMapping("/order/pakout/default/v1")
@AppAuth(memo = "鍚屾宸ュ崟鍗曟嵁")
public synchronized R orderPakout(@RequestHeader(required = false) String appkey,
diff --git a/src/main/java/com/zy/asrs/entity/param/CheckParam.java b/src/main/java/com/zy/asrs/entity/param/CheckParam.java
new file mode 100644
index 0000000..93569bb
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/param/CheckParam.java
@@ -0,0 +1,13 @@
+package com.zy.asrs.entity.param;
+
+import com.zy.common.model.DetlDto;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class CheckParam {
+ private String locNo;
+ private String containerCode;
+ private List<DetlDto> locDetls;
+}
diff --git a/src/main/java/com/zy/asrs/entity/param/MesBuyPakinReportParam.java b/src/main/java/com/zy/asrs/entity/param/MesBuyPakinReportParam.java
new file mode 100644
index 0000000..e4cdc08
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/param/MesBuyPakinReportParam.java
@@ -0,0 +1,53 @@
+package com.zy.asrs.entity.param;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 閲囪喘鍏ュ簱涓婃姤鍙傛暟
+ */
+@Data
+public class MesBuyPakinReportParam {
+ //閲囪喘璁㈠崟缂栫爜
+ private String code;
+ private List<Iteam> iteam;
+
+ @Data
+ public static class Iteam{
+ //鐗╂枡缂栧彿
+ private String materialCode;
+ //鎵规鍙�
+ private String batchNo;
+ //饧嗙淮鐮�
+ private String qrCode;
+ //閲囪喘璁㈠崟饩忓彿
+ private String lineNo;
+ //饧婂簱鏁伴噺
+ private Double amount;
+ //澶囨敞
+ private String remark;
+ //鍗曚綅鍚嶇О
+ private String unit;
+ //渚涘簲鍟嗙紪鍙�
+ private String supplierCode;
+ //饧婂簱浣嶇疆
+ private String storageLocationCode;
+
+ public Iteam(String materialCode, String batchNo, String qrCode, String lineNo, Double amount, String remark, String supplierCode, String storageLocationCode) {
+ this.materialCode = materialCode;
+ this.batchNo = batchNo;
+ this.qrCode = qrCode;
+ this.lineNo = lineNo;
+ this.amount = amount;
+ this.remark = remark;
+ this.supplierCode = supplierCode;
+ this.storageLocationCode = storageLocationCode;
+ }
+
+ public Iteam(){
+
+ }
+ }
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/param/MesOrderReportParam.java b/src/main/java/com/zy/asrs/entity/param/MesOrderReportParam.java
new file mode 100644
index 0000000..24a35ab
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/param/MesOrderReportParam.java
@@ -0,0 +1,89 @@
+package com.zy.asrs.entity.param;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * MES璋冩嫧鍙傛暟
+ */
+@Data
+public class MesOrderReportParam {
+ //缂栫爜
+ private String code;
+ //澶囨敞
+ private String remark;
+ private List<TransferOrderItem> transferOrderItems;
+ private RecordCustomFieldBaseCO recordCustomFieldBaseCO;
+
+ @Data
+ public static class RecordCustomFieldBaseCO{
+ private List<CustomField> customFields;
+
+ @Data
+ public static class CustomField{
+ private String fieldCode;
+ private String fieldValue;
+
+ public CustomField(String fieldCode, String fieldValue) {
+ this.fieldCode = fieldCode;
+ this.fieldValue = fieldValue;
+ }
+ }
+ }
+
+ @Data
+ public static class TransferOrderItem{
+
+ //琛屽娉� 鍗曟嵁鍙�
+ private String remark;
+ //鎺ユ敹浠撲綅
+ private String targetLocationCode;
+
+ private List<InventoryDetail> inventoryDetails;
+
+
+ @Data
+ public static class InventoryDetail{
+ private Amount amount;
+ private BizKey bizKey;
+ //鍙戝嚭浠撲綅
+ private String locationCode;
+ //鐗╂枡缂栫爜
+ private String materialCode;
+ //璐ㄩ噺鐘舵��
+ private Integer qcStatus;
+ //浠撳偍鐘舵��
+ private Integer storageStatus;
+ //鐗堟湰鍙凤紝榛樿涓簄ull
+ private String version;
+
+ @Data
+ public static class Amount{
+ //鏁伴噺
+ private Double amount;
+ //鍗曚綅缂栫爜
+ private String unitCode;
+ //鍗曚綅鍚嶇О 浜岄�変竴
+ private String unitName;
+
+ public Amount(Double amount, String unitName, String unitCode) {
+ this.amount = amount;
+ this.unitCode = unitCode;
+ this.unitName = unitName;
+ }
+ }
+
+ @Data
+ public static class BizKey{
+ //鎵规
+ private String batchNo;
+
+ public BizKey(String batchNo) {
+ this.batchNo = batchNo;
+ }
+ }
+ }
+
+ }
+}
diff --git a/src/main/java/com/zy/asrs/entity/param/MesPakinReportParam.java b/src/main/java/com/zy/asrs/entity/param/MesPakinReportParam.java
new file mode 100644
index 0000000..462d4b8
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/param/MesPakinReportParam.java
@@ -0,0 +1,41 @@
+package com.zy.asrs.entity.param;
+
+import lombok.Data;
+
+/**
+ * MES鍏ュ簱涓婃姤鍙傛暟
+ */
+@Data
+public class MesPakinReportParam {
+ private String bizType;
+ private String inboundOrderCode;
+ private String remark;
+ private InventoryAttr inventoryAttr;
+ private NoQrCodeExecAmount noQrCodeExecAmount;
+
+ @Data
+ public static class InventoryAttr{
+ private String batchNo;
+ private String materialCode;
+ private String storageLocationCode;
+
+ public InventoryAttr(String batchNo,String materialCode,String storageLocationCode){
+ this.batchNo = batchNo;
+ this.materialCode = materialCode;
+ this.storageLocationCode = storageLocationCode;
+ }
+ }
+
+ @Data
+ public static class NoQrCodeExecAmount{
+ private Double amount;
+ private String unitName;
+ private String unitCode;
+
+ public NoQrCodeExecAmount(Double amount, String unitName, String unitCode) {
+ this.amount = amount;
+ this.unitName = unitName;
+ this.unitCode = unitCode;
+ }
+ }
+}
diff --git a/src/main/java/com/zy/asrs/entity/param/MesPakoutReportParam.java b/src/main/java/com/zy/asrs/entity/param/MesPakoutReportParam.java
new file mode 100644
index 0000000..ec501ad
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/param/MesPakoutReportParam.java
@@ -0,0 +1,39 @@
+package com.zy.asrs.entity.param;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * MES鍑哄簱涓婃姤鍙傛暟
+ */
+@Data
+public class MesPakoutReportParam {
+ //鐗╂枡缂栫爜
+ private String materialCode;
+ //澶囨敞
+ private String remark;
+ //浠撲綅缂栧彿
+ private String storageCode;
+ //浠撳簱缂栧彿
+ private String wareHouseCode;
+
+ private List<String> batchNos;
+
+ private Amount amount;
+
+ @Data
+ public static class Amount{
+ private Double amount;
+ //鍗曚綅缂栧彿(缂栧彿鍜屽悕绉板繀濉竴涓�,涓よ�呬笉涓�鑷翠笖閮芥湁鏁堜互缂栧彿涓哄噯)
+ private String unitCode;
+ //鍗曚綅鍚嶇О(缂栧彿鍜屽悕绉板繀濉竴涓�,涓よ�呬笉涓�鑷翠笖閮芥湁鏁堜互缂栧彿涓哄噯)
+ private String unitName;
+
+ public Amount(Double amount, String unitName, String unitCode) {
+ this.amount = amount;
+ this.unitCode = unitCode;
+ this.unitName = unitName;
+ }
+ }
+}
diff --git a/src/main/java/com/zy/asrs/entity/param/OrderSyncParam.java b/src/main/java/com/zy/asrs/entity/param/OrderSyncParam.java
index 5f3f9c3..fc67c8d 100644
--- a/src/main/java/com/zy/asrs/entity/param/OrderSyncParam.java
+++ b/src/main/java/com/zy/asrs/entity/param/OrderSyncParam.java
@@ -12,8 +12,10 @@
//鍏ュ嚭搴撴爣璁�
private Integer pakin;
+ //鍗曟嵁绫诲瀷
+ private String orderType;
- //閲囪喘璁㈠崟缂栧彿
+ //璁㈠崟缂栧彿
private String cPOID;
//渚涘簲鍟嗙紪鐮�
private String cVenCode;
@@ -88,10 +90,12 @@
@Data
public static class OrderDetl{
- //閲囪喘璁㈠崟琛屽彿
+ //璁㈠崟琛屽彿
private String ivouchrowno;
//鐗╂枡缂栫爜
private String cInvCode;
+ //鎵瑰彿
+ private String batch;
//闇�姹傛椂闂�
private String dArriveDate;
//闇�姹傛暟閲�
diff --git a/src/main/java/com/zy/asrs/service/OpenService.java b/src/main/java/com/zy/asrs/service/OpenService.java
index 58e5630..93c86d9 100644
--- a/src/main/java/com/zy/asrs/service/OpenService.java
+++ b/src/main/java/com/zy/asrs/service/OpenService.java
@@ -5,6 +5,7 @@
import com.zy.asrs.entity.param.*;
import com.zy.asrs.entity.result.OpenOrderCompeteResult;
import com.zy.asrs.entity.result.StockVo;
+import com.zy.common.model.LocDetlDto;
import java.util.List;
@@ -78,4 +79,8 @@
*/
boolean orderDelete(String orderNo);
+ /*
+ 搴撳瓨鐩樼偣
+ */
+ boolean checkAndAdjustLocDetl(CheckParam params);
}
diff --git a/src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java
index 8959640..39d6cbb 100644
--- a/src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java
@@ -390,7 +390,7 @@
//鐢熸垚绉诲簱宸ヤ綔妗�
AgvWrkMast wrkMast = createWrkMast(11, 21L, sourceLocNo, targetLocNo, sourceLocDetl.getSuppCode(), now, userId,getContainerTypeByloc(sourceLocNo));
//鐢熸垚宸ヤ綔鍏氭槑缁�
- createWrkDetlReWrite(sourceLocDetl.getMatnr(),wrkMast.getWrkNo(),null,sourceLocDetl.getBatch(),sourceLocDetl.getAnfme(),sourceLocDetl.getZpallet(),now,userId,sourceLocDetl.getThreeCode(),sourceLocDetl.getDeadTime(),sourceLocDetl.getProcessSts());
+ createWrkDetlReWrite(sourceLocDetl.getMatnr(),wrkMast.getWrkNo(),null,sourceLocDetl.getBatch(),sourceLocDetl.getAnfme(),sourceLocDetl.getZpallet(),now,userId,sourceLocDetl.getThreeCode(),sourceLocDetl.getDeadTime());
//淇敼鐩爣搴撲綅鐘舵��
updateAgvLocMast(targetLocMast,"S");
//淇敼鍘熷簱浣嶇姸鎬�
@@ -533,6 +533,7 @@
updateAgvLocMast(agvLocMast,"S");
return agvLocMast.getLocNo();
}
+
/*
绌烘澘鍑哄簱
*/
@@ -1055,6 +1056,7 @@
wrkDetl.setAppeTime(now);
wrkDetl.setModiUser(userId);
wrkDetl.setModiTime(now);
+
wrkDetl.setThreeCode(csocode);
wrkDetl.setDeadTime(isoseq);
if (!agvWrkDetlService.insert(wrkDetl)) {
@@ -1117,7 +1119,6 @@
wrkMast.setModiUser(userId);
wrkMast.setModiTime(now);
wrkMast.setLogErrMemo("createWaitPainWrkMastStart");
-
if (!agvWrkMastService.insertByIncrease(wrkMast)) {
throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐�");
}
@@ -1228,4 +1229,4 @@
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
index 1d7833c..05eff1d 100644
--- a/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -16,7 +16,9 @@
import com.zy.asrs.utils.MatUtils;
import com.zy.common.model.DetlDto;
import com.zy.common.utils.NodeUtils;
+import lombok.Synchronized;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -59,6 +61,10 @@
private WrkDetlService wrkDetlService;
@Autowired
private ReportQueryMapper reportQueryMapper;
+ @Autowired
+ private AgvLocMastService agvLocMastService;
+ @Autowired
+ private AgvLocDetlService agvLocDetlService;
@Override
@Transactional
@@ -129,6 +135,9 @@
}
OrderDetl orderDetl = new OrderDetl();
orderDetl.sync(mat);
+ if (!Cools.isEmpty(detlDto.getCFree1())){
+ orderDetl.setSpecs(detlDto.getCFree1());
+ }
orderDetl.setBatch(detlDto.getBatch());
orderDetl.setAnfme(detlDto.getAnfme());
orderDetl.setOrderId(order.getId());
@@ -918,6 +927,49 @@
return true;
}
+ @Override
+ @Transactional
+ @Synchronized
+ public boolean checkAndAdjustLocDetl(CheckParam params) {
+
+ //鍒ゆ柇搴撲綅鏄惁瀛樺湪
+ AgvLocMast agvLocMast = agvLocMastService.selectById(params.getLocNo());
+ if(Cools.isEmpty(agvLocMast)){
+ throw new CoolException("搴撲綅鍙蜂笉瀛樺湪");
+ }
+
+ if(!Cools.eq("O",agvLocMast.getLocSts()) && !Cools.eq("F",agvLocMast.getLocSts())){
+ throw new CoolException("褰撳墠搴撲綅姝e湪浣滀笟涓紝鏃犳硶鐩樼偣璋冩暣");
+ }
+
+ if(Cools.isEmpty(params.getLocDetls())){
+ agvLocMast.setLocSts("O");
+ }else {
+ agvLocMast.setLocSts("F");
+ }
+
+ agvLocMastService.updateById(agvLocMast);
+
+ //鍒犻櫎鏃у簱瀛�
+ agvLocDetlService.delete(new EntityWrapper<AgvLocDetl>().eq("loc_no",params.getLocNo()));
+
+ //鏂板鐩樼偣搴撳瓨
+ for (DetlDto detlDto : params.getLocDetls()){
+ AgvLocDetl agvLocDetl = new AgvLocDetl();
+ Mat mat = matService.selectByMatnr(detlDto.getMatnr());
+ BeanUtils.copyProperties(mat,agvLocDetl);
+ agvLocDetl.setLocNo(params.getLocNo());
+ agvLocDetl.setSuppCode(params.getContainerCode());
+ agvLocDetl.setAnfme(detlDto.getAnfme());
+ agvLocDetl.setBatch(detlDto.getBatch());
+ agvLocDetl.setThreeCode(detlDto.getCsocode());
+ agvLocDetl.setDeadTime(detlDto.getIsoseq());
+ agvLocDetlService.insert(agvLocDetl);
+ }
+
+ return true;
+ }
+
private Order orderMapping(OrderSyncParam param, Date now, boolean pakin, String docName){
Order order = new Order();
//uuid
@@ -930,6 +982,9 @@
//鍗曟嵁鏃ユ湡
order.setOrderTime(param.getDdate());
+ //渚涘簲鍟嗙紪鐮�
+ order.setSalesman(param.getCVenCode());
+
order.setMemo(param.getCMemo());
//鍒跺崟浜�
order.setShipCode(param.getCPersonCode());
diff --git a/src/main/java/com/zy/asrs/task/AutoMoveScheduler.java b/src/main/java/com/zy/asrs/task/AutoMoveScheduler.java
index db4034f..04fe7ac 100644
--- a/src/main/java/com/zy/asrs/task/AutoMoveScheduler.java
+++ b/src/main/java/com/zy/asrs/task/AutoMoveScheduler.java
@@ -82,7 +82,7 @@
try{
autoMoveHandler.start2(agvWrkMast);
} catch (Exception e){
- log.error("宸ヤ綔鍙�"+agvWrkMast.getWrkNo()+"璋冩嫧鍑哄簱,澶勭悊澶辫触锛�===銆嬪紓甯稿師鍥狅細"+e.getMessage());
+ //log.error("宸ヤ綔鍙�"+agvWrkMast.getWrkNo()+"璋冩嫧鍑哄簱,澶勭悊澶辫触锛�===銆嬪紓甯稿師鍥狅細"+e.getMessage());
}
}
@@ -130,7 +130,7 @@
try{
autoMoveHandler.start3(agvWrkMast);
} catch (Exception e){
- log.error("宸ヤ綔鍙�"+agvWrkMast.getWrkNo()+"璋冩嫧鍑哄簱,澶勭悊澶辫触锛�===銆嬪紓甯稿師鍥狅細"+e.getMessage());
+ //log.error("宸ヤ綔鍙�"+agvWrkMast.getWrkNo()+"璋冩嫧鍑哄簱,澶勭悊澶辫触锛�===銆嬪紓甯稿師鍥狅細"+e.getMessage());
}
}
diff --git a/src/main/java/com/zy/asrs/task/handler/AgvWrkMastHandler.java b/src/main/java/com/zy/asrs/task/handler/AgvWrkMastHandler.java
index 93e8c90..9a23068 100644
--- a/src/main/java/com/zy/asrs/task/handler/AgvWrkMastHandler.java
+++ b/src/main/java/com/zy/asrs/task/handler/AgvWrkMastHandler.java
@@ -1,14 +1,20 @@
package com.zy.asrs.task.handler;
+import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
-import com.core.common.R;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
+import com.zy.asrs.entity.param.MesBuyPakinReportParam;
+import com.zy.asrs.entity.param.MesOrderReportParam;
+import com.zy.asrs.entity.param.MesPakinReportParam;
+import com.zy.asrs.entity.param.MesPakoutReportParam;
import com.zy.asrs.service.*;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
+import com.zy.common.utils.HttpHandler;
import lombok.Synchronized;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -17,17 +23,52 @@
import org.springframework.transaction.annotation.Transactional;
import java.io.IOException;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import java.util.stream.Collectors;
@Slf4j
@Service
public class AgvWrkMastHandler extends AbstractHandler<String> {
+ //鍏ュ簱绫诲瀷鏁扮粍
+ private static final List<Integer> IN_TYPE_LIST = new ArrayList<Integer>(){{
+ add(1);
+ }};
+ //private static final int[] IN_TYPE_ARRAY = {1};
+ //鍑哄簱绫诲瀷鏁扮粍
+ private static final List<Integer> OUT_TYPE_List = new ArrayList<Integer>(){{
+// add(101);
+ }};
+ //private static final int[] OUT_TYPE_ARRAY = {101};
+ //绉诲簱绫诲瀷鏁扮粍
+ private static final List<Integer> MOVE_TYPE_List = new ArrayList<Integer>(){{
+ add(11);add(101); add(12); add(53); add(101); add(108); add(111); add(112);
+
+
+ }};
+ //private static final int[] MOVE_TYPE_ARRAY = {11,12};
+
@Value("${agvBasDev.maxWorkNum}")
private int maxWrokNum;
+ @Value("${mes.url}")
+ private String url;
+ @Value("${mes.getTokenUrl}")
+ private String getTokenUrl;
+ @Value("${mes.orderReportPath}")
+ private String orderReportPath;
+ @Value("${mes.pakinReportPath}")
+ private String pakinReportPath;
+ @Value("${mes.buyPakinReportPath}")
+ private String buyPakinReportPath;
+ @Value("${mes.pakoutReportPath}")
+ private String pakoutReportPath;
+ @Value("${mes.getTokenPath}")
+ private String getTokenPath;
+ @Value("${mes.appKey}")
+ private String appKey;
+ @Value("${mes.appSecret}")
+ private String appSecret;
+
@Autowired
private AgvWrkMastService agvWrkMastService;
@@ -51,9 +92,18 @@
private AgvBasDevpService agvBasDevpService;
@Autowired
private AgvWorkService agvWorkService;
+ @Autowired
+ private ApiLogService apiLogService;
+ @Autowired
+ private DocTypeService docTypeService;
+ @Autowired
+ private OrderDetlService orderDetlService;
@Transactional
public ReturnT<String> completedPutWayWrk(AgvWrkMast agvWrkMast) {
+ //鐢ㄤ簬涓婃姤mes鐨勫伐浣滄。鏄庣粏
+ List<AgvWrkDetl> agvWrkDetlListOld = agvWrkDetlService.selectList(new EntityWrapper<AgvWrkDetl>().eq("wrk_no", agvWrkMast.getWrkNo()));
+
try{
int wrkNo = agvWrkMast.getWrkNo();
String barcode = agvWrkMast.getBarcode();
@@ -241,17 +291,30 @@
});
}
- return SUCCESS;
+ //涓婃姤mes
+// MesOrderReportParam param = generateMesParam(agvWrkMast, agvWrkDetlListOld);
+// if(!Cools.isEmpty(param)){
+// doHttpRequest(param,getMesTokenInfo(),"涓婃姤mes鍗曟嵁淇℃伅",url,orderReportPath,null,"127.0.0.1");
+// }
+
+ //return SUCCESS;
}catch (Exception e){
log.error(""+e.getMessage());
}
- return FAIL;
+ reportMes(agvWrkMast,agvWrkDetlListOld);
+ return SUCCESS;
}
@Transactional
public ReturnT<String> completedCarryWrk(AgvWrkMast agvWrkMast) {
+
+ //鐢ㄤ簬涓婃姤mes鐨勫伐浣滄。鏄庣粏
+ List<AgvWrkDetl> agvWrkDetlListOld = agvWrkDetlService.selectList(new EntityWrapper<AgvWrkDetl>().eq("wrk_no", agvWrkMast.getWrkNo()));
+
+
try{
+
Date now = new Date();
int wrkNo = agvWrkMast.getWrkNo();
String orderNo = getOrderNoByWrkNo(wrkNo);
@@ -291,7 +354,6 @@
wrkMast.setModiUser(9527L);
wrkMast.setModiTime(now);
wrkMast.setLogErrMemo("completedCarryWrk");
-
if (!agvWrkMastService.insertByIncrease(wrkMast)) {
throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐�");
}
@@ -328,15 +390,25 @@
orderService.checkComplete(o);
});
}
- return SUCCESS;
+
+ //涓婃姤mes
+// MesOrderReportParam param = generateMesParam(agvWrkMast, agvWrkDetlListOld);
+// if(!Cools.isEmpty(param)){
+// doHttpRequest(param,getMesTokenInfo(),"涓婃姤mes鍗曟嵁淇℃伅",url,orderReportPath,null,"127.0.0.1");
+// }
+
}catch (Exception e){
log.error(""+e.getMessage());
}
- return FAIL;
+ reportMes(agvWrkMast,agvWrkDetlListOld);
+ return SUCCESS;
}
@Transactional
public ReturnT<String> completedCarryWrk2(AgvWrkMast agvWrkMast) {
+ //鐢ㄤ簬涓婃姤mes鐨勫伐浣滄。鏄庣粏
+ List<AgvWrkDetl> agvWrkDetlListOld = agvWrkDetlService.selectList(new EntityWrapper<AgvWrkDetl>().eq("wrk_no", agvWrkMast.getWrkNo()));
+
try{
int wrkNo = agvWrkMast.getWrkNo();
String orderNo = getOrderNoByWrkNo(wrkNo);
@@ -374,11 +446,18 @@
orderService.checkComplete(o);
});
}
- return SUCCESS;
+ //涓婃姤mes
+// MesOrderReportParam param = generateMesParam(agvWrkMast, agvWrkDetlListOld);
+// if(!Cools.isEmpty(param)){
+// doHttpRequest(param,getMesTokenInfo(),"涓婃姤mes鍗曟嵁淇℃伅",url,orderReportPath,null,"127.0.0.1");
+// }
+// reportMes(agvWrkMast,agvWrkDetlListOld);
+// return SUCCESS;
}catch (Exception e){
log.error(""+e.getMessage());
}
- return FAIL;
+ reportMes(agvWrkMast,agvWrkDetlListOld);
+ return SUCCESS;
}
@Transactional
@@ -547,4 +626,219 @@
return wrkMast;
}
+
+ private void reportMes(AgvWrkMast agvWrkMast, List<AgvWrkDetl> agvWrkDetls){
+ if(Cools.isEmpty(agvWrkDetls)){
+ return ;
+ }
+ //鍖哄垎涓嶅悓浠诲姟绫诲瀷鐨勪笂鎶ユ柟寮�
+
+ if(IN_TYPE_LIST.contains(agvWrkMast.getIoType())){
+ reportMesPakinOrder(agvWrkMast,agvWrkDetls);
+ }
+ if(OUT_TYPE_List.contains(agvWrkMast.getIoType())){
+ reportMesPakoutOrder(agvWrkMast,agvWrkDetls);
+ }
+ if(MOVE_TYPE_List.contains(agvWrkMast.getIoType())){
+ generateMesParam(agvWrkMast,agvWrkDetls);
+ }
+ }
+
+ private void reportMesPakinOrder(AgvWrkMast agvWrkMast, List<AgvWrkDetl> agvWrkDetls){
+
+ for (AgvWrkDetl agvWrkDetl : agvWrkDetls){
+ //鍒ゆ柇鏄惁閲囪喘鍏ュ簱
+
+ String orderNo = agvWrkDetl.getOrderNo();
+ Order order = orderService.selectByNo(orderNo);
+
+ DocType docType = docTypeService.selectById(order.getDocType());
+
+ if (docType.getDocName().contains("閲囪喘")){
+
+ OrderDetl orderDetl = orderDetlService.selectByOrderNoAndMatnr(orderNo, agvWrkDetl.getMatnr(), agvWrkDetl.getThreeCode(), agvWrkDetl.getDeadTime());
+
+ MesBuyPakinReportParam mesBuyPakinReportParam = new MesBuyPakinReportParam();
+ List<MesBuyPakinReportParam.Iteam> iteams = new ArrayList<>();
+ MesBuyPakinReportParam.Iteam iteam = new MesBuyPakinReportParam.Iteam();
+ iteam.setMaterialCode(agvWrkDetl.getMatnr());
+ iteam.setBatchNo(agvWrkDetl.getBatch());
+ iteam.setAmount(agvWrkDetl.getAnfme());
+ iteam.setStorageLocationCode(agvWrkMast.getLocNo());
+ iteam.setLineNo(orderDetl.getItemNum());
+ iteam.setSupplierCode(order.getSalesman());
+ iteam.setUnit(agvWrkDetl.getUnit());
+
+ iteams.add(iteam);
+
+ mesBuyPakinReportParam.setCode(orderNo);
+ mesBuyPakinReportParam.setIteam(iteams);
+
+ doHttpRequest(mesBuyPakinReportParam,getMesTokenInfo(),"涓婃姤mes閲囪喘鍏ュ簱淇℃伅",url,buyPakinReportPath,null,"127.0.0.1");
+
+ }else {
+ MesPakinReportParam mesPakinReportParam = new MesPakinReportParam();
+ mesPakinReportParam.setInboundOrderCode(agvWrkDetl.getOrderNo());
+ mesPakinReportParam.setBizType("0");
+ mesPakinReportParam.setInventoryAttr(new MesPakinReportParam.InventoryAttr(agvWrkDetl.getThreeCode().trim(),agvWrkDetl.getMatnr(),agvWrkMast.getLocNo()));
+ mesPakinReportParam.setNoQrCodeExecAmount(new MesPakinReportParam.NoQrCodeExecAmount(agvWrkDetl.getAnfme(),agvWrkDetl.getUnit(),null));
+
+ doHttpRequest(mesPakinReportParam,getMesTokenInfo(),"涓婃姤mes鍏ュ簱淇℃伅",url,pakinReportPath,null,"127.0.0.1");
+ }
+ }
+
+ }
+
+ private void reportMesPakoutOrder(AgvWrkMast agvWrkMast, List<AgvWrkDetl> agvWrkDetls){
+ for (AgvWrkDetl agvWrkDetl : agvWrkDetls){
+ MesPakoutReportParam mesPakoutReportParam = new MesPakoutReportParam();
+ mesPakoutReportParam.setStorageCode(agvWrkMast.getLocNo());
+ AgvLocMast agvLocMast = agvLocMastService.selectById(agvWrkMast.getLocNo());
+ mesPakoutReportParam.setWareHouseCode(agvLocMast.getPltType().toString());
+ mesPakoutReportParam.setMaterialCode(agvWrkDetl.getMatnr());
+ mesPakoutReportParam.setBatchNos(Arrays.asList(agvWrkDetl.getThreeCode().trim()));
+ mesPakoutReportParam.setAmount(new MesPakoutReportParam.Amount(agvWrkDetl.getAnfme(),agvWrkDetl.getUnit(),null));
+
+ doHttpRequest(mesPakoutReportParam,getMesTokenInfo(),"涓婃姤mes鍑哄簱淇℃伅",url,pakoutReportPath,null,"127.0.0.1");
+
+ }
+ }
+
+ private void generateMesParam(AgvWrkMast agvWrkMast, List<AgvWrkDetl> agvWrkDetls){
+
+ if(agvWrkMast.getIoType() == 53){
+ String locNo = agvWrkMast.getLocNo();
+ agvWrkMast.setLocNo(agvWrkMast.getSourceLocNo());
+ agvWrkMast.setSourceLocNo(locNo);
+ }
+
+ MesOrderReportParam param = new MesOrderReportParam();
+
+ List<MesOrderReportParam.TransferOrderItem> transferOrderItems = new ArrayList<>();
+ List<MesOrderReportParam.TransferOrderItem.InventoryDetail> inventoryDetails = new ArrayList<>();
+ List<MesOrderReportParam.RecordCustomFieldBaseCO.CustomField> customFields = new ArrayList<>();
+
+ MesOrderReportParam.RecordCustomFieldBaseCO recordCustomFieldBaseCO = new MesOrderReportParam.RecordCustomFieldBaseCO();
+ recordCustomFieldBaseCO.setCustomFields(customFields);
+ param.setRecordCustomFieldBaseCO(recordCustomFieldBaseCO);
+
+ //娣诲姞transferOrderItem灞炴��
+ MesOrderReportParam.TransferOrderItem transferOrderItem = new MesOrderReportParam.TransferOrderItem();
+ transferOrderItem.setRemark(agvWrkDetls.get(0).getOrderNo());
+ //璋冩嫧
+ if(agvWrkMast.getLocNo().contains("YZ")){
+ transferOrderItem.setTargetLocationCode(agvWrkMast.getLocNo());
+ }else {
+ //鍑哄簱榛樿浠撲綅
+ String floor = agvWrkMast.getLocNo().split("F")[1];
+ transferOrderItem.setTargetLocationCode(getTargetLocationByFloor(floor));
+ }
+ transferOrderItems.add(transferOrderItem);
+ transferOrderItem.setInventoryDetails(inventoryDetails);
+
+ param.setTransferOrderItems(transferOrderItems);
+
+ for (AgvWrkDetl agvWrkDetl : agvWrkDetls){
+ MesOrderReportParam.TransferOrderItem.InventoryDetail inventoryDetail = new MesOrderReportParam.TransferOrderItem.InventoryDetail();
+ //娣诲姞amount灞炴��
+ MesOrderReportParam.TransferOrderItem.InventoryDetail.Amount amount = new MesOrderReportParam.TransferOrderItem.InventoryDetail.Amount(agvWrkDetl.getAnfme(),agvWrkDetl.getUnit(),null);
+ inventoryDetail.setAmount(amount);
+ //娣诲姞bizKey灞炴��
+ MesOrderReportParam.TransferOrderItem.InventoryDetail.BizKey bizKey = new MesOrderReportParam.TransferOrderItem.InventoryDetail.BizKey(Cools.isEmpty(agvWrkDetl.getBatch()) ? "" : agvWrkDetl.getBatch().trim());
+ inventoryDetail.setBizKey(bizKey);
+ //娣诲姞inventoryDetail灞炴��
+ inventoryDetail.setLocationCode(agvWrkMast.getSourceLocNo());
+ inventoryDetail.setMaterialCode(agvWrkDetl.getMatnr());
+ inventoryDetail.setQcStatus(1);
+ inventoryDetail.setStorageStatus(1);
+ inventoryDetails.add(inventoryDetail);
+ //娣诲姞閿�鍞鍗曞彿
+ MesOrderReportParam.RecordCustomFieldBaseCO.CustomField customField = new MesOrderReportParam.RecordCustomFieldBaseCO.CustomField("workOrderCode__c",agvWrkDetl.getThreeCode().trim());
+ customFields.add(customField);
+ }
+
+ doHttpRequest(param,getMesTokenInfo(),"涓婃姤mes璋冩嫧淇℃伅",url,orderReportPath,null,"127.0.0.1");
+
+ }
+
+ //鑾峰彇mes token淇℃伅
+ private Map<String,Object> getMesTokenInfo(){
+ Map<String,String> param = new HashMap<>();
+ param.put("appKey",appKey);
+ param.put("appSecret",appSecret);
+
+ JSONObject jsonObject = doHttpRequest(param,null, "鑾峰彇MesToken", getTokenUrl, getTokenPath, null, "127.0.0.1");
+
+ Map<String,Object> headParam = new HashMap<>();
+ headParam.put("X-AUTH",JSON.parseObject(jsonObject.get("data").toString()).get("appAccessToken").toString());
+
+ return headParam;
+
+ }
+
+ //鏍规嵁妤煎眰榛樿鍑哄簱浠撲綅
+ private String getTargetLocationByFloor(String f){
+ int floor = Integer.parseInt(f);
+ if(floor == 1){
+ return "WH-000";
+ }
+
+ if(floor == 2){
+ return "WH-000";
+ }
+
+ if(floor == 3){
+ return "WH-000";
+ }
+
+ return null;
+ }
+
+ private JSONObject doHttpRequest(Object requestParam,Map<String,Object> headParam, String namespace, String url, String path, String appkey, String ip){
+
+ String response = "";
+ boolean success = false;
+
+ try {
+ response = new HttpHandler.Builder()
+ .setUri(url)
+ .setPath(path)
+ .setHeaders(headParam)
+ .setJson(JSONObject.toJSONString(requestParam))
+ .setHttps(true)
+ .build()
+ .doPost();
+ JSONObject jsonObject = JSON.parseObject(response);
+
+ if(Cools.isEmpty(jsonObject.get("code")) || Integer.parseInt(jsonObject.get("code").toString()) != 200){
+ throw new CoolException(jsonObject.get("dsc").toString());
+ }
+ success = true;
+ return jsonObject;
+
+// String succeed = jsonObject.get("succeed").toString();
+//
+// int code = Cools.eq("0",succeed) ? 0 : 1;
+// if(code != 200){
+// throw new CoolException(jsonObject.get("dsc").toString());
+// }
+// success = true;
+
+ }catch (Exception e){
+ log.error(e.getMessage());
+ throw new CoolException(e.getMessage());
+ }finally {
+ apiLogService.save(
+ namespace,
+ url + path,
+ appkey,
+ ip,
+ JSON.toJSONString(JSONObject.toJSONString(requestParam)),
+ response,
+ success
+ );
+ }
+
+ }
+
}
diff --git a/src/main/java/com/zy/asrs/task/handler/AutoMoveHandler.java b/src/main/java/com/zy/asrs/task/handler/AutoMoveHandler.java
index 6a10807..9648cba 100644
--- a/src/main/java/com/zy/asrs/task/handler/AutoMoveHandler.java
+++ b/src/main/java/com/zy/asrs/task/handler/AutoMoveHandler.java
@@ -199,6 +199,7 @@
}
agvWrkMast.setWrkSts(201L);
agvWrkMast.setLocNo(locMast.getLocNo());
+ agvWrkMast.setLogErrMemo("start2-doAutoMove2");
agvWrkMastService.updateById(agvWrkMast);
//鏇存柊鐩爣搴撲綅鐘舵��
updateAgvLocMast(locMast,"S");
@@ -310,6 +311,7 @@
updateAgvBasDevp(devpNo,"S",agvLocMast.getLocType2(),agvLocMast.getBarcode());
return SUCCESS;
}
+
public ReturnT<String> autoEmptyBack3(AgvWrkMast agvWrkMast) {
Date now = new Date();
AgvBasDevp agvBasDevp = agvBasDevpService.selectByDevNo(agvWrkMast.getSourceLocNo());
@@ -332,6 +334,7 @@
updateAgvBasDevp(agvBasDevp,"R");
return SUCCESS;
}
+
public ReturnT<String> autoEmptyBack2(AgvLocMast agvLocMast) {
Date now = new Date();
//鏌ヨ宸ヤ綔妗�
diff --git a/src/main/java/com/zy/common/model/DetlDto.java b/src/main/java/com/zy/common/model/DetlDto.java
index 422e62e..00640f9 100644
--- a/src/main/java/com/zy/common/model/DetlDto.java
+++ b/src/main/java/com/zy/common/model/DetlDto.java
@@ -30,6 +30,8 @@
//閿�鍞鍗曡鍙�
private String isoseq;
+ private String cFree1;
+
// 搴撲綅绫诲瀷锛� 1銆佷唬鍖呰鎴愬搧锛�2銆佸師鏉愭枡锛�3銆佺澹�
private Integer locType;
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index cd5a48f..fc45b8b 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -90,9 +90,16 @@
ERP:
url: http://39.184.149.30:8877
orderReportPath: /DBMS/U8/CM/add
-MES:
- url: http://192.168.1.55:8010
- orderReportPath: /api/RdAudit
+mes:
+ url: https://v3-ali.blacklake.cn/api/openapi/domain/web/v1/route
+ orderReportPath: /inventory/open/v2/transfer_order/ordinary/_execute
+ pakinReportPath: /inventory/open/v2/inbound_order/execute/_inbound
+ buyPakinReportPath: /schedule-for-yinzuo/open/yinzuo/inboundOrder
+ pakoutReportPath: /inventory/open/v2/outbound_order/_outbound_by_suggest
+ getTokenUrl: https://v3-ali.blacklake.cn
+ getTokenPath: /api/openapi/domain/api/v1/access_token/_get_access_token
+ appKey: cli_1712644281065780
+ appSecret: 6710d24e31e64adc963d4c213b2c9b8e
agvBasDev:
maxWorkNum: 1
diff --git a/src/main/webapp/static/js/agvLocMast/locMast.js b/src/main/webapp/static/js/agvLocMast/locMast.js
index 1951580..f1154c4 100644
--- a/src/main/webapp/static/js/agvLocMast/locMast.js
+++ b/src/main/webapp/static/js/agvLocMast/locMast.js
@@ -23,7 +23,6 @@
,{field: 'locNo', align: 'center',title: '搴撲綅鍙�',sort:true}
,{field: 'locSts$', align: 'center',title: '搴撲綅鐘舵��',width:200}
// ,{field: 'whsType$', align: 'center',title: '搴撲綅绫诲瀷'}
- // ,{field: 'pltType', align: 'center',title: ''}
// ,{field: 'ctnType', align: 'center',title: ''}
// ,{field: 'locSts', align: 'center',title: ''}
// ,{field: 'sheetNo', align: 'center',title: ''}
@@ -35,6 +34,7 @@
,{field: 'floor', align: 'center',title: '妤�', sort:true}
,{field: 'barcode', align: 'center',title: '璐ф灦鐮�', sort:true}
,{field: 'locType2', align: 'center',title: '璐ф灦绫诲瀷', sort:true}
+ ,{field: 'pltType', align: 'center',title: '浠撲綅缂栫爜'}
,{field: 'fullPlt', align: 'center',title: '婊℃澘', templet:function(row){
var html = "<input value='fullPlt' type='checkbox' lay-skin='primary' lay-filter='tableCheckbox' disabled table-index='"+row.LAY_TABLE_INDEX+"'";
if(row.fullPlt === 'Y'){html += " checked ";}
diff --git a/src/main/webapp/static/js/order/order.js b/src/main/webapp/static/js/order/order.js
index f333b04..82180e2 100644
--- a/src/main/webapp/static/js/order/order.js
+++ b/src/main/webapp/static/js/order/order.js
@@ -62,7 +62,6 @@
{field: 'tel', align: 'center',title: '浠撳簱', hide: true},
{field: 'operMemb', align: 'center',title: '鍑哄叆搴撶被鍒�', hide: true},
{field: 'salesman', align: 'center',title: '閮ㄩ棬', hide: true},
-
{align: 'center', title: '鎿嶄綔', toolbar: '#operate', width: 180}
]],
request: {
@@ -166,7 +165,9 @@
//{field: 'manu', title: '琛屽彿'},
{field: 'threeCode', title: '閿�鍞崟鍙�'},
{field: 'deadTime', title: '鑷敱椤�'},
- {field: 'processSts$', title: '宸ュ簭'}
+ {field: 'processSts$', title: '宸ュ簭'},
+ {field: 'specs', title: '瑙勬牸'},
+ //{field: 'itemNum', title: '琛屽敮涓�鏍囪瘑'}
]],
request: {
pageName: 'curr',
@@ -192,7 +193,6 @@
});
}
});
-
// 鏄剧ず琛ㄥ崟寮圭獥
function showEditModel(expTpe) {
@@ -306,7 +306,6 @@
},
size: ''
};
-
if (!isExpAdd) {
$.ajax({
url: baseUrl+"/order/detl/all/auth?orderId=" + expTpe.id,
diff --git a/src/main/webapp/views/order/order.html b/src/main/webapp/views/order/order.html
index dc07fa1..e7cd9b7 100644
--- a/src/main/webapp/views/order/order.html
+++ b/src/main/webapp/views/order/order.html
@@ -311,7 +311,7 @@
<script type="text/javascript" src="../../static/js/echarts/echarts.min.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
-<script type="text/javascript" src="../../static/js/order/order.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/order/order.js?v=1" charset="utf-8"></script>
<script type="text/template" id="docTypeTpl">
<option value="">閫夋嫨绫诲瀷</option>
--
Gitblit v1.9.1