【测试】用友数据反写

dev
siontion 2 months ago
parent ab7d68bc5b
commit f82ff6e0eb

@ -4,12 +4,18 @@ import com.chanjet.openapi.sdk.java.exception.ChanjetApiException;
import com.chanjet.openapi.sdk.java.response.GetTokenResponse;
import com.chanjet.openapi.sdk.java.response.RefreshTokenResponse;
import com.chanko.yunxi.mes.framework.common.pojo.CommonResult;
import com.chanko.yunxi.mes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.chanko.yunxi.mes.framework.tenant.core.aop.TenantIgnore;
import com.chanko.yunxi.mes.module.biz.controller.admin.chanjet.vo.BomMaterialReqVO;
import com.chanko.yunxi.mes.module.biz.controller.admin.chanjet.vo.BomMaterialVO;
import com.chanko.yunxi.mes.module.biz.controller.admin.chanjet.vo.QueryCurrentStockResVO;
import com.chanko.yunxi.mes.module.biz.controller.admin.procedure.vo.ProcedureSaveReqVO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.projectorder.ProjectOrderDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.taskreport.TaskReportDO;
import com.chanko.yunxi.mes.module.biz.dal.mysql.projectorder.ProjectOrderMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.storage.StorageMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.taskreport.TaskReportMapper;
import com.chanko.yunxi.mes.module.biz.enums.ProjectOrderStatusEnum;
import com.chanko.yunxi.mes.module.biz.manager.ChanjetManager;
import com.chanko.yunxi.mes.module.biz.manager.ChanjetSchedule;
import com.chanko.yunxi.mes.module.system.controller.admin.user.vo.user.UserSaveReqVO;
@ -56,6 +62,12 @@ public class ChanjetController {
@Resource
private ChanjetTokenHolder chanjetTokenHolder;
@Resource
private ProjectOrderMapper projectOrderMapper;
@Resource
private TaskReportMapper taskReportMapper;
/**
* OAuth
@ -257,29 +269,69 @@ public class ChanjetController {
@PermitAll
@TenantIgnore
@GetMapping("/chronicData")
@Operation(summary = "定时更新")
@Operation(summary = "定时更新(物料和库存)")
@PreAuthorize("@ss.hasPermission('biz:storage:create')")
@Scheduled(cron = "0 0 3 * * ?")
public void synchronizeData() throws ChanjetApiException{
// chanjetManager.queryMaterial();
// //查询库存-现存量
// chanjetSchedule.queryStock();
// //创建入库
// chanjetSchedule.createStorageInOrder();
chanjetManager.createProductionOrder(232L);
//测试
// chanjetManager.createProductionOrder(232L);
// sendProcedureReport2TPlus();
// chanjetSchedule.createStorageOut();
chanjetSchedule.createStorageInOrder();
}
@PermitAll
@TenantIgnore
@GetMapping("/sendData2TPlus")
@Operation(summary = "定时更新")
@GetMapping("/sendProductOrder2TPlus")
@Operation(summary = "定时更新(生产加工单)")
@PreAuthorize("@ss.hasPermission('biz:storage:create')")
@Scheduled(cron = "0 0 2 * * ?")
public void synchronizeData2() throws ChanjetApiException{
//查询库存-现存量
// chanjetSchedule.createStorageOut();
@Scheduled(cron = "0 0 0 * * ?")
public void sendProductOrder2TPlus() throws ChanjetApiException{
List<ProjectOrderDO> projectOrderDOS = projectOrderMapper.selectList(new LambdaQueryWrapperX<ProjectOrderDO>(){{
eq(ProjectOrderDO::getOrderStatus, ProjectOrderStatusEnum.DISPATCH.getCode());
isNull(ProjectOrderDO::getTs);
}});
for (ProjectOrderDO po : projectOrderDOS) {
chanjetManager.createProductionOrder(po.getId());
}
}
@PermitAll
@TenantIgnore
@GetMapping("/sendProcedureReport2TPlus")
@Operation(summary = "定时更新(工序汇报单)")
@PreAuthorize("@ss.hasPermission('biz:storage:create')")
@Scheduled(cron = "0 30 0 * * ?")
public void sendProcedureReport2TPlus() throws ChanjetApiException{
List<TaskReportDO> taskReportDOS = taskReportMapper.selectUnSynchReportData();
for (TaskReportDO po : taskReportDOS) {
chanjetManager.createTaskReport(po.getId());
}
}
@PermitAll
@TenantIgnore
@GetMapping("/sendStorageOut2TPlus")
@Operation(summary = "定时更新(材料出库单)")
@PreAuthorize("@ss.hasPermission('biz:storage:create')")
@Scheduled(cron = "0 0 1 * * ?")
public void sendStorageOut2TPlus() throws ChanjetApiException{
//创建出库单
chanjetSchedule.createStorageOut();
}
chanjetManager.createProductionOrder(232L);
@PermitAll
@TenantIgnore
@GetMapping("/sendStorageIn2TPlus")
@Operation(summary = "定时更新(产成品入库单)")
@PreAuthorize("@ss.hasPermission('biz:storage:create')")
@Scheduled(cron = "0 30 1 * * ?")
public void sendStorageIn2TPlus() throws ChanjetApiException{
//创建入库单
chanjetSchedule.createStorageInOrder();
}
}

@ -31,10 +31,12 @@ public enum ChanjetInterfaceEnum {
CREATE_STOCK_OUT_ORDER("/tplus/api/v2/materialDispatch/Create", "创建出库单", CreateStockOutOrderReqVO.class, ResultResVO.class),
CREATE_PRODUCTION_ORDER("/tplus/api/v2/ManufactureOrderOpenApi/Create", "创建生产加工单", CreateProductionOrderReqVO.class, ResultResVO.class),
UPDATE_PRODUCTION_ORDER("/tplus/api/v2/ManufactureOrderOpenApi/Update", "创建生产加工单", CreateProductionOrderReqVO.class, ResultResVO.class),
UPDATE_PRODUCTION_ORDER("/tplus/api/v2/ManufactureOrderOpenApi/Update", "修改生产加工单", CreateProductionOrderReqVO.class, ResultResVO.class),
DELETE_PRODUCTION_ORDER("/tplus/api/v2/ManufactureOrderOpenApi/Delete", "删除生产加工单", CreateProductionOrderReqVO.class, ResultResVO.class),
AUDIT_PRODUCTION_ORDER("/tplus/api/v2/ManufactureOrderOpenApi/Audit", "审核生产加工单", AuditProductionOrderReqVO.class, ResultResVO.class),
UN_AUDIT_PRODUCTION_ORDER("/tplus/api/v2/ManufactureOrderOpenApi/UnAudit", "弃审生产加工单", AuditProductionOrderReqVO.class, ResultResVO.class),
QUERY_PRODUCTION_ORDER_LIST("/tplus/api/v2/ManufactureOrderOpenApi/FindVoucherList", "查询生产加工单", ListProductionOrderReqVO.class, ListResultResVO.class),
QUERY_PRODUCTION_ORDER_LIST("/tplus/api/v2/ManufactureOrderOpenApi/FindVoucherList", "查询生产加工单列表", ListProductionOrderReqVO.class, ListResultResVO.class),
QUERY_PRODUCTION_ORDER("/tplus/api/v2/ManufactureOrderOpenApi/GetVoucherDTO", "查询生产加工单", QuerySaleOrderReqVO.class, ResultResVO.class),
CREATE_REPORT("/tplus/api/v2/ManufactureReportOpenApi/Create", "创建工序汇报单", CreateReportReqVO.class, ResultResVO.class),
UPDATE_REPORT("/tplus/api/v2/ManufactureReportOpenApi/Update", "修改工序汇报单", CreateReportReqVO.class, ResultResVO.class),

@ -35,4 +35,8 @@ public class Process {
return Name;
}
public Process(String code){
this.Code = code;
}
}

@ -116,5 +116,7 @@ public class StorageDO extends BaseDO {
private Long workshopId;
@TableField(exist = false)
private String workshopName;
@TableField(exist = false)
private String workshopCode;
}

@ -118,6 +118,9 @@ public class TaskReportDO extends BaseDO {
@TableField(exist = false)
private String procedureName;
@TableField(exist = false)
private String procedureCode;
@TableField(exist = false)
private String updaterName;
@ -130,7 +133,8 @@ public class TaskReportDO extends BaseDO {
@TableField(exist = false)
private String ownerUsername;
private Integer hasSynch;
private Boolean hasSynch;
private Boolean hasSynchStorage;
@TableField(exist = false)
private Integer isFinal;

@ -57,9 +57,11 @@ public interface StorageMapper extends BaseMapperX<StorageDO> {
MPJLambdaWrapper<StorageDO> query = new MPJLambdaWrapper<>();
query.selectAll(StorageDO.class)
.select("d.name as projectSubName,d.code as projectSubCode")
.select("e.name as workshopName,e.code as workshopCode")
.leftJoin(TaskDispatchDO.class, "b", TaskDispatchDO::getCode, StorageDO::getHeaderNo)
.leftJoin(ProjectOrderSubDO.class, "c", ProjectOrderSubDO::getId, TaskDispatchDO::getProjectSubId)
.leftJoin(MaterialDO.class, "d", MaterialDO::getId, ProjectOrderSubDO::getMaterialId)
.leftJoin(WorkshopDO.class,"e",WorkshopDO::getId,StorageDO::getWorkshopId)
.disableSubLogicDel()
.eq(StorageDO::getId, id)
.last("LIMIT 1");

@ -108,6 +108,7 @@ public interface TaskReportMapper extends BaseMapperX<TaskReportDO> {
"e.name as projectSubName", "e.code as projectSubCode", "e.spec", "e.unit")
.select("z.code as dispatchCode")
.select("y.name as procedureName")
.select("y.code as procedureCode")
.select("u1.nickname as ownerName", "u2.nickname as updaterName")
.select("u1.username as ownerUsername")
.select("a.plan_no as planCode")
@ -147,7 +148,7 @@ public interface TaskReportMapper extends BaseMapperX<TaskReportDO> {
.orderByDesc(TaskReportDO::getId)
.disableSubLogicDel();
query.apply(true,"c.warehouse_id is not null","").apply(true,"(t.has_synch is null or t.has_synch={0})","0");
query.apply(true,"c.warehouse_id is not null","").apply(true,"(t.has_synch_storage is null or t.has_synch_storage={0})","0");
return selectPage(reqVO, query);
}
@ -263,5 +264,22 @@ public interface TaskReportMapper extends BaseMapperX<TaskReportDO> {
return selectPage(pageReqVO,query);
}
default List<TaskReportDO> selectUnSynchReportData() {
MPJLambdaWrapperX<TaskReportDO> query = new MPJLambdaWrapperX<>();
query.distinct()
.select("t.id")
.leftJoin("pro_task_dispatch_detail as a on t.dispatch_detail_id=a.id")
.leftJoin("pro_task_dispatch as b on b.id=a.dispatch_id")
.leftJoin("project_sale_order_sub as c on c.project_order_id=b.project_id and c.id=b.project_sub_id")
.disableSubLogicDel();
query.isNull(TaskReportDO::getHasSynch)
.apply("c.production_id is not null and c.production_detail_id is not null")
;
return selectList(query);
}
}

@ -14,6 +14,7 @@ import com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum;
import com.chanko.yunxi.mes.framework.operatelog.core.service.OperateLogFrameworkService;
import com.chanko.yunxi.mes.module.biz.controller.admin.chanjet.ChanjetSpi;
import com.chanko.yunxi.mes.module.biz.controller.admin.chanjet.dto.*;
import com.chanko.yunxi.mes.module.biz.controller.admin.chanjet.dto.Process;
import com.chanko.yunxi.mes.module.biz.controller.admin.chanjet.vo.*;
import com.chanko.yunxi.mes.module.biz.controller.admin.procedure.vo.ProcedureSaveReqVO;
import com.chanko.yunxi.mes.module.biz.controller.admin.projectorder.ProjectOrderController;
@ -1312,15 +1313,22 @@ public class ChanjetManager {
ManufactureReportDetails reportDetail = new ManufactureReportDetails();
ArrayList<ManufactureReportTeamDetails> reportTeamDetails = new ArrayList<>();
manufactureReportDetails.add(reportDetail);
reportDetail.setQuantity(aDO.getAmount())
reportDetail.setSourceVoucherId(taskDispatchDetailDO.getProductionId())
.setSourceVoucherDetailId(taskDispatchDetailDO.getProductionDetailId())
.setInventory(new Inventory(taskDispatchDetailDO.getProjectSubCode()))
.setRouting(new Routing("99"))
.setProcess(new Process(aDO.getProcedureCode()))
.setUnit(new Unit(taskDispatchDetailDO.getUnit()))
.setWorkShop(new WorkShopDTO(taskDispatchDetailDO.getWorkshopCode()))
.setQuantity(aDO.getAmount())
.setManufactureReportTeamDetails(reportTeamDetails)
.setSourceVoucherId(taskDispatchDetailDO.getProductionId())
.setSourceVoucherDetailId(taskDispatchDetailDO.getProductionDetailId())
;
ManufactureReportTeamDetails reportTeamDetail = new ManufactureReportTeamDetails();
reportTeamDetails.add(reportTeamDetail);
reportTeamDetail.setPerson(new Person(aDO.getOwnerUsername()));
reportTeamDetail.setQuantity(aDO.getAmount());
// 设置为“否”,关闭所有与用友通信的接口;为“是”,打开所有与用友通信的接口
if(getSystemParameters()) {
@ -1328,6 +1336,9 @@ public class ChanjetManager {
if (!result.isSuccess()) {
throw exception(CALL_API_ERROR);
}
aDO.setHasSynch(true);
taskReportMapper.updateById(aDO);
}
}
@ -1462,52 +1473,89 @@ public class ChanjetManager {
.setManufactureOrderDetails(detailList);
// ManufactureOrderDetails detail = new ManufactureOrderDetails();
// DictDataDO dictDataDO = dictDataMapper.selectByDictTypeAndValue(DictTypeConstants.MATERIAL_UNIT.getCode(), subDOList.get(0).getUnit());
//
// detail.setInventory(new Inventory(subDOList.get(0).getProjectSubCode()))
// .setUnit(new Unit(dictDataDO.getLabel()))
// .setQuantity(subDOList.get(0).getAmount())
// .setPreStartDate(aDo.getProjectStartTime().format(DateTimeFormatter.ISO_DATE))
// .setPreFinishDate(aDo.getProjectEndTime().format(DateTimeFormatter.ISO_DATE))
// ;
// detailList.add(detail);
// 设置生产加工单工序信息
List<ManufactureOrderProcessDetails> manufactureOrderProcessDetailsList = new ArrayList<>();
ManufactureOrderProcessDetails manufactureOrderProcessDetails = new ManufactureOrderProcessDetails();
manufactureOrderProcessDetails.setInventory(new Inventory(subDOList.get(0).getProjectSubCode()));
ProcessingType processingType = new ProcessingType();
processingType.setCode("HomeMade");
manufactureOrderProcessDetails.setProcessingType(processingType);
manufactureOrderProcessDetails.setUnit(new Unit(subDOList.get(0).getUnit()));
// 生产订单必须要选择工序,否则无法与工序汇报单无法匹配
manufactureOrderProcessDetails.setProcess(new Process("01"));
manufactureOrderProcessDetailsList.add(manufactureOrderProcessDetails);
subDOList.forEach(subDO -> {
ManufactureOrderDetails detail = new ManufactureOrderDetails();
DictDataDO dictDataDO = dictDataMapper.selectByDictTypeAndValue(DictTypeConstants.MATERIAL_UNIT.getCode(), subDO.getUnit());
DictDataDO dictDataDO = dictDataMapper.selectByDictTypeAndValue(DictTypeConstants.MATERIAL_UNIT.getCode(), subDOList.get(0).getUnit());
detail.setInventory(new Inventory(subDO.getProjectSubCode()))
detail.setInventory(new Inventory(subDOList.get(0).getProjectSubCode()))
.setUnit(new Unit(dictDataDO.getLabel()))
.setQuantity(subDO.getAmount())
.setQuantity(subDOList.get(0).getAmount())
.setPreStartDate(aDo.getProjectStartTime().format(DateTimeFormatter.ISO_DATE))
.setPreFinishDate(aDo.getProjectEndTime().format(DateTimeFormatter.ISO_DATE))
.setManufactureOrderProcessDetails(manufactureOrderProcessDetailsList)
;
detailList.add(detail);
});
// subDOList.forEach(subDO -> {
// ManufactureOrderDetails detail = new ManufactureOrderDetails();
// DictDataDO dictDataDO = dictDataMapper.selectByDictTypeAndValue(DictTypeConstants.MATERIAL_UNIT.getCode(), subDO.getUnit());
//
// detail.setInventory(new Inventory(subDO.getProjectSubCode()))
// .setUnit(new Unit(dictDataDO.getLabel()))
// .setQuantity(subDO.getAmount())
// .setPreStartDate(aDo.getProjectStartTime().format(DateTimeFormatter.ISO_DATE))
// .setPreFinishDate(aDo.getProjectEndTime().format(DateTimeFormatter.ISO_DATE))
// ;
// detailList.add(detail);
// });
// 设置为“是”,打开所有与用友通信的接口
if(getSystemParameters()) {
//判断是否已经提交过生产加工单
CommonResult<ListResultResVO> resultExist =
chanjetSpi.invoke(QUERY_PRODUCTION_ORDER_LIST, new ListProductionOrderReqVO(aDo.getCode()), ListResultResVO.class);
if (!resultExist.isSuccess()) {
throw new RuntimeException("queryProductionOrder exception: " + JSON.toJSONString(resultExist));
}
CommonResult<ResultResVO> result = null;
if(aDo.getTs()==null || aDo.getTs().isEmpty()){
if(resultExist.getData().getData()!=null && resultExist.getData().getData().getTotalCount()==0){
//没提交过,直接创建生产加工单
result = chanjetSpi.invoke(CREATE_PRODUCTION_ORDER, new CreateProductionOrderReqVO(dto), ResultResVO.class);
}else{
//生产加工单修改前要先弃审
CommonResult<ResultResVO> result3 = chanjetSpi.invoke(UN_AUDIT_PRODUCTION_ORDER, new QuerySaleOrderReqVO(new QuerySaleOrderReqVO.SaleOrderParamVO(aDo.getCode())), ResultResVO.class);
//生产加工单修改接口问题,重新提交时要先弃审,删除,再重新创建,
CommonResult<ResultResVO> result3 =
chanjetSpi.invoke(UN_AUDIT_PRODUCTION_ORDER, new QuerySaleOrderReqVO(new QuerySaleOrderReqVO.SaleOrderParamVO(aDo.getCode())), ResultResVO.class);
if (!result3.isSuccess() || !result3.getData().isSuccess()) {
throw new RuntimeException(result3.getMsg());
}
dto.setTs(aDo.getTs());
result = chanjetSpi.invoke(UPDATE_PRODUCTION_ORDER, new CreateProductionOrderReqVO(dto), ResultResVO.class);
//更新时必须带创建后用友返回的时间戳TODO:更新接口不明确,暂时不用,取而代之使用删除接口
// dto.setTs(aDo.getTs());
// result = chanjetSpi.invoke(UPDATE_PRODUCTION_ORDER, new CreateProductionOrderReqVO(dto), ResultResVO.class);
CommonResult<ResultResVO> result4 =
chanjetSpi.invoke(DELETE_PRODUCTION_ORDER,
new AuditProductionOrderReqVO(new AuditProductionOrderReqVO.AuditProductionOrderParamVO(externalCode)),
ResultResVO.class);
if (!result4.isSuccess() || !result4.getData().isSuccess()) {
throw new RuntimeException(result4.getMsg());
}
//删除成功后,重新提交生产加工单
result = chanjetSpi.invoke(CREATE_PRODUCTION_ORDER, new CreateProductionOrderReqVO(dto), ResultResVO.class);
}
// CommonResult<ResultResVO> result = chanjetSpi.invoke(UPDATE_PRODUCTION_ORDER, new CreateProductionOrderReqVO(dto), ResultResVO.class);
if (!result.isSuccess() || !result.getData().isSuccess()) {
throw exception(CALL_API_ERROR);
}
// 暂不考虑失败场景 TODO 重试接口
CommonResult<ResultResVO> result2 = chanjetSpi.invoke(AUDIT_PRODUCTION_ORDER, new AuditProductionOrderReqVO(new AuditProductionOrderReqVO.AuditProductionOrderParamVO(externalCode)), ResultResVO.class);
// 创建成功后,需要重新审核 暂不考虑失败场景 TODO 重试接口
CommonResult<ResultResVO> result2 =
chanjetSpi.invoke(AUDIT_PRODUCTION_ORDER, new AuditProductionOrderReqVO(new AuditProductionOrderReqVO.AuditProductionOrderParamVO(externalCode)), ResultResVO.class);
if (!result2.isSuccess() || !result2.getData().isSuccess()) {
throw new RuntimeException(result2.getMsg());
}
@ -1519,7 +1567,8 @@ public class ChanjetManager {
projectOrderMapper.updateById(aDo);
// 查询报工单数据 将id回写至子项目表
Map<String, List<ProjectOrderSubDO>> subGroupByProjectSubCode = subDOList.stream().collect(Collectors.groupingBy(ProjectOrderSubDO::getProjectSubCode));
CommonResult<ListResultResVO> listResult = chanjetSpi.invoke(QUERY_PRODUCTION_ORDER_LIST, new ListProductionOrderReqVO(rMap.get("Code")), ListResultResVO.class);
CommonResult<ListResultResVO> listResult =
chanjetSpi.invoke(QUERY_PRODUCTION_ORDER_LIST, new ListProductionOrderReqVO(rMap.get("Code")), ListResultResVO.class);
if (!listResult.isSuccess() || listResult.getData() == null || listResult.getData().getData() == null || listResult.getData().getData().getTotalCount() == 0) {
throw new RuntimeException("queryProductionOrder exception: " + JSON.toJSONString(listResult));
}

@ -624,7 +624,7 @@ public class ChanjetSchedule {
});
reprotResult.getList().forEach(item->{
item.setHasSynch(1);
item.setHasSynchStorage(true);
taskReportMapper.updateById(item);
});
storageMapper.updateTenantId();
@ -662,7 +662,7 @@ public class ChanjetSchedule {
.setVoucherDate(sdf.format(new Date()))
.setRDRecordDetails(detailList)
.setWarehouse(new Warehouse(warehouseDO.getWhNo()))
.setDepartment(new DepartmentDTO().setCode(null).setName(null))
.setDepartment(new DepartmentDTO().setName(storage.getWorkshopName()).setCode(storage.getWorkshopCode()))
;
vo.forEach(mat -> {

@ -672,4 +672,5 @@ alter table wms_storage_check_mat Modify COLUMN pn_id bigint(20) default null CO
//================================20240816====================================================================
alter table project_sale_order ADD COLUMN ts varchar(32) default null COMMENT '用友时间戳';
ALTER TABLE pro_task_report ADD COLUMN `has_synch_storage` TINYINT(1) DEFAULT null COMMENT '入库同步标识';

Loading…
Cancel
Save