Commit 6b963db9 authored by 李驰骋's avatar 李驰骋

ERP接口调用、日志添加

parent 5f8c898d
package com.ximai; package com.ximai;
import com.bstek.ureport.console.UReportServlet; import com.bstek.ureport.console.UReportServlet;
import com.ximai.mes.md.service.IMdItemService;
import com.ximai.mes.pro.service.proWorkOrder.IProWorkorderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
...@@ -10,6 +14,7 @@ import org.springframework.context.annotation.Bean; ...@@ -10,6 +14,7 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ImportResource; import org.springframework.context.annotation.ImportResource;
import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.web.context.request.RequestContextListener;
import springfox.documentation.oas.annotations.EnableOpenApi; import springfox.documentation.oas.annotations.EnableOpenApi;
/** /**
...@@ -21,13 +26,17 @@ import springfox.documentation.oas.annotations.EnableOpenApi; ...@@ -21,13 +26,17 @@ import springfox.documentation.oas.annotations.EnableOpenApi;
@EnableFeignClients(basePackages = {"com.ximai"}) @EnableFeignClients(basePackages = {"com.ximai"})
@EnableScheduling @EnableScheduling
@EnableOpenApi @EnableOpenApi
public class RuoYiApplication { public class RuoYiApplication implements CommandLineRunner {
public static void main(String[] args) { public static void main(String[] args) {
// System.setProperty("spring.devtools.restart.enabled", "false"); SpringApplication springApplication = new SpringApplication(RuoYiApplication.class);
SpringApplication.run(RuoYiApplication.class, args); springApplication.run(args);
// System.out.println("MES启动成功\n"); }
@Override
public void run(String... args) throws Exception {
} }
@Bean @Bean
public ServletRegistrationBean urportServlet() { public ServletRegistrationBean urportServlet() {
ServletRegistrationBean bean = new ServletRegistrationBean(new UReportServlet()); ServletRegistrationBean bean = new ServletRegistrationBean(new UReportServlet());
......
...@@ -53,6 +53,7 @@ basic.error.request.error=\u670D\u52A1\u5668\u9650\u6D41\u5F02\u5E38\uFF0C\u8BF7 ...@@ -53,6 +53,7 @@ basic.error.request.error=\u670D\u52A1\u5668\u9650\u6D41\u5F02\u5E38\uFF0C\u8BF7
basic.response.success=\u64CD\u4F5C\u6210\u529F basic.response.success=\u64CD\u4F5C\u6210\u529F
basic.response.fail=\u64CD\u4F5C\u5931\u8D25 basic.response.fail=\u64CD\u4F5C\u5931\u8D25
basic.data.not.exist=\u6570\u636E\u4E0D\u5B58\u5728 basic.data.not.exist=\u6570\u636E\u4E0D\u5B58\u5728
basic.error.repeat.confirm=\u91CD\u590D\u786E\u8BA4
basic.data.disable=\u6570\u636E\u5DF2\u88AB\u7981\u7528 basic.data.disable=\u6570\u636E\u5DF2\u88AB\u7981\u7528
basic.data.deleted=\u6570\u636E\u5DF2\u88AB\u5220\u9664 basic.data.deleted=\u6570\u636E\u5DF2\u88AB\u5220\u9664
basic.error.data.exist=\u6570\u636E\u5DF2\u7ECF\u5B58\u5728\uFF01 basic.error.data.exist=\u6570\u636E\u5DF2\u7ECF\u5B58\u5728\uFF01
......
...@@ -53,6 +53,7 @@ basic.error.request.error=Server throttling exception. Please try again later. ...@@ -53,6 +53,7 @@ basic.error.request.error=Server throttling exception. Please try again later.
basic.response.success=Operation successful. basic.response.success=Operation successful.
basic.response.fail=Operation failed. basic.response.fail=Operation failed.
basic.data.not.exist=Data does not exist. basic.data.not.exist=Data does not exist.
basic.error.repeat.confirm=Repeat confirm.
basic.data.disable=Data has been disabled. basic.data.disable=Data has been disabled.
basic.data.deleted=Data has been deleted. basic.data.deleted=Data has been deleted.
basic.error.data.exist=Data already exists! basic.error.data.exist=Data already exists!
......
...@@ -53,6 +53,7 @@ basic.error.request.error=\u0E02\u0E49\u0E2D\u0E22\u0E01\u0E40\u0E27\u0E49\u0E19 ...@@ -53,6 +53,7 @@ basic.error.request.error=\u0E02\u0E49\u0E2D\u0E22\u0E01\u0E40\u0E27\u0E49\u0E19
basic.response.success=\u0E1B\u0E0F\u0E34\u0E1A\u0E31\u0E15\u0E34\u0E01\u0E32\u0E23\u0E2A\u0E4D\u0E32\u0E40\u0E23\u0E47\u0E08 basic.response.success=\u0E1B\u0E0F\u0E34\u0E1A\u0E31\u0E15\u0E34\u0E01\u0E32\u0E23\u0E2A\u0E4D\u0E32\u0E40\u0E23\u0E47\u0E08
basic.response.fail=\u0E1B\u0E0F\u0E34\u0E1A\u0E31\u0E15\u0E34\u0E01\u0E32\u0E23\u0E25\u0E49\u0E21\u0E40\u0E2B\u0E25\u0E27 basic.response.fail=\u0E1B\u0E0F\u0E34\u0E1A\u0E31\u0E15\u0E34\u0E01\u0E32\u0E23\u0E25\u0E49\u0E21\u0E40\u0E2B\u0E25\u0E27
basic.data.not.exist=\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E44\u0E21\u0E48\u0E21\u0E35\u0E2D\u0E22\u0E39\u0E48 basic.data.not.exist=\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E44\u0E21\u0E48\u0E21\u0E35\u0E2D\u0E22\u0E39\u0E48
basic.error.repeat.confirm=\u0E22\u0E37\u0E19\u0E22\u0E31\u0E19
basic.data.disable=\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E16\u0E39\u0E01\u0E1B\u0E34\u0E14\u0E01\u0E32\u0E23\u0E43\u0E0A\u0E49\u0E07\u0E32\u0E19 basic.data.disable=\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E16\u0E39\u0E01\u0E1B\u0E34\u0E14\u0E01\u0E32\u0E23\u0E43\u0E0A\u0E49\u0E07\u0E32\u0E19
basic.data.deleted=\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E16\u0E39\u0E01\u0E25\u0E1A\u0E41\u0E25\u0E49\u0E27 basic.data.deleted=\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E16\u0E39\u0E01\u0E25\u0E1A\u0E41\u0E25\u0E49\u0E27
basic.error.data.exist=\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E21\u0E35\u0E2D\u0E22\u0E39\u0E48\u0E41\u0E25\u0E49\u0E27! basic.error.data.exist=\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E21\u0E35\u0E2D\u0E22\u0E39\u0E48\u0E41\u0E25\u0E49\u0E27!
......
package com.ximai.common.annotation;
import com.ximai.common.enums.BusinessType;
import com.ximai.common.enums.InOutType;
import com.ximai.common.enums.OperatorType;
import java.lang.annotation.*;
/**
* 自定义操作日志记录注解
*
*
*/
@Target({ ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ApiLog
{
/**
* 模块
*/
public String title() default "";
/**
* 功能
*/
public BusinessType businessType() default BusinessType.OTHER;
/**
* 操作人类别
*/
public OperatorType operatorType() default OperatorType.MANAGE;
/**
* 调入、调出
*/
public InOutType inOutType() default InOutType.IN;
/**
* 是否保存请求的参数
*/
public boolean isSaveRequestData() default true;
/**
* 是否保存响应的参数
*/
public boolean isSaveResponseData() default true;
}
package com.ximai.common.enums;
/**
* 操作人类别
*
*/
public enum InOutType
{
/**
* 其它
*/
IN,
/**
* 后台用户
*/
OUT,
}
...@@ -8,6 +8,7 @@ import javax.servlet.http.HttpServletRequest; ...@@ -8,6 +8,7 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSession;
import cn.hutool.core.util.ObjectUtil;
import com.ximai.common.constant.Constants; import com.ximai.common.constant.Constants;
import com.ximai.common.utils.data.StringUtils; import com.ximai.common.utils.data.StringUtils;
import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestAttributes;
...@@ -74,7 +75,11 @@ public class ServletUtils ...@@ -74,7 +75,11 @@ public class ServletUtils
*/ */
public static HttpServletRequest getRequest() public static HttpServletRequest getRequest()
{ {
return getRequestAttributes().getRequest(); ServletRequestAttributes requestAttributes = getRequestAttributes();
if(ObjectUtil.isEmpty(requestAttributes)){
return null;
}
return requestAttributes.getRequest();
} }
/** /**
......
...@@ -112,7 +112,7 @@ public class IpUtils ...@@ -112,7 +112,7 @@ public class IpUtils
*/ */
public static byte[] textToNumericFormatV4(String text) public static byte[] textToNumericFormatV4(String text)
{ {
if (text.length() == 0) if (StringUtils.isEmpty(text))
{ {
return null; return null;
} }
......
package com.ximai.framework.aspectj; package com.ximai.framework.aspectj;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.ximai.common.annotation.Log; import com.ximai.common.annotation.Log;
import com.ximai.common.core.domain.model.LoginUser; import com.ximai.common.core.domain.model.LoginUser;
...@@ -64,11 +65,14 @@ public class LogAspect { ...@@ -64,11 +65,14 @@ public class LogAspect {
SysOperLog operLog = new SysOperLog(); SysOperLog operLog = new SysOperLog();
operLog.setStatus(BusinessStatus.SUCCESS.ordinal()); operLog.setStatus(BusinessStatus.SUCCESS.ordinal());
// 请求的地址 // 请求的地址
String ip = IpUtils.getIpAddr(ServletUtils.getRequest()); HttpServletRequest request = ServletUtils.getRequest();
operLog.setOperIp(ip); String requestURI = "";
String requestURI = ServletUtils.getRequest().getRequestURI(); if(ObjectUtil.isNotEmpty(request)){
operLog.setOperUrl(requestURI); String ip = IpUtils.getIpAddr(request);
operLog.setOperIp(ip);
requestURI = request.getRequestURI();
operLog.setOperUrl(requestURI);
}
// 获取当前的用户 // 获取当前的用户
LoginUser loginUser = null; LoginUser loginUser = null;
try { try {
...@@ -78,7 +82,6 @@ public class LogAspect { ...@@ -78,7 +82,6 @@ public class LogAspect {
} }
} catch (Exception ex) { } catch (Exception ex) {
log.info("url:" + requestURI + "获取接口用户报错: " + ex.getMessage()); log.info("url:" + requestURI + "获取接口用户报错: " + ex.getMessage());
// throw new RuntimeException(ex);
} }
...@@ -91,16 +94,16 @@ public class LogAspect { ...@@ -91,16 +94,16 @@ public class LogAspect {
String methodName = joinPoint.getSignature().getName(); String methodName = joinPoint.getSignature().getName();
operLog.setMethod(className + "." + methodName + "()"); operLog.setMethod(className + "." + methodName + "()");
// 设置请求方式 // 设置请求方式
operLog.setRequestMethod(ServletUtils.getRequest().getMethod()); if(ObjectUtil.isNotEmpty(request)) {
operLog.setRequestMethod(request.getMethod());
}
// 处理设置注解上的参数 // 处理设置注解上的参数
getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult); getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult);
// 保存数据库 // 保存数据库
AsyncManager.me().execute(AsyncFactory.recordOper(operLog)); AsyncManager.me().execute(AsyncFactory.recordOper(operLog));
} catch (Exception exp) { } catch (Exception exp) {
// 记录本地异常日志 // 记录本地异常日志
log.error("==前置通知异常=="); log.error("Log前置通知异常:", exp);
log.error("异常信息:{}", exp.getMessage());
exp.printStackTrace();
} }
} }
......
package com.ximai.mes.aspect;
import java.lang.annotation.*;
/**
* 方法扩展处理
*/
public interface IExtendedProcess {
public void process(Object[] args, Object returnResult);
}
package com.ximai.mes.aspect;
import java.lang.annotation.*;
/**
* 方法扩展处理
*/
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MethodExtendedProcess {
/**
* 系统参数开关名,不配置为默认开启
* @return
*/
String sysSwitchParam() default "";
/**
* 处理实现类
*
* @return
*/
Class<? extends IExtendedProcess> processClz();
/**
* 是否新开线程
* @return
*/
boolean newThread() default false;
/**
* 是否捕获异常
* 仅对非新开线程有效
* @return
*/
boolean errorCatch() default false;
}
package com.ximai.mes.aspect;
import cn.hutool.core.util.ObjectUtil;
import com.ximai.common.core.domain.AjaxResult;
import com.ximai.common.utils.DictUtils;
import com.ximai.framework.config.ApplicationConfig;
import com.ximai.framework.manager.AsyncManager;
import com.ximai.mes.wm.domain.WmBarcodeConfig;
import com.ximai.mes.wm.service.IWmBarcodeConfigService;
import com.ximai.system.domain.SysConfig;
import com.ximai.system.service.ISysConfigService;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import java.util.List;
import java.util.TimerTask;
@Aspect
@Component
public class MethodExtendedProcessAspect {
private static final Logger log = LoggerFactory.getLogger(MethodExtendedProcessAspect.class);
@Autowired
ApplicationContext applicationContext;
@Autowired
ISysConfigService configService;
/**
* 根据扩展业务配置执行处理方法
* @param joinPoint
* @param extendedProcesses
* @param returnResult
*/
@AfterReturning(pointcut = "@annotation(extendedProcesses)",returning = "returnResult")
public void doAfter(JoinPoint joinPoint, MethodExtendedProcesses extendedProcesses, Object returnResult){
for(MethodExtendedProcess extendedProcess : extendedProcesses.config()){
if(ObjectUtil.isNotEmpty(extendedProcess.sysSwitchParam())){
String val = configService.selectConfigByKey(extendedProcess.sysSwitchParam());
if("0".equals(val)){
return;
}
}
IExtendedProcess process = applicationContext.getBean(extendedProcess.processClz());
ServletRequestAttributes requestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
RequestContextHolder.setRequestAttributes(requestAttributes, true);
if(extendedProcess.newThread()){
AsyncManager.me().execute(new TimerTask() {
@Override
public void run() {
process.process(joinPoint.getArgs(), returnResult);
}
});
}else{
if(extendedProcess.errorCatch()){
try {
process.process(joinPoint.getArgs(), returnResult);
} catch (Exception e){
log.error("扩展处理执行失败,", e);
}
}else{
process.process(joinPoint.getArgs(), returnResult);
}
}
}
}
}
package com.ximai.mes.aspect;
import java.lang.annotation.*;
/**
* 方法扩展处理
*/
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MethodExtendedProcesses {
MethodExtendedProcess[] config();
}
package com.ximai.mes.config; package com.ximai.mes.config;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.ximai.common.annotation.ApiLog;
import com.ximai.common.annotation.Log; import com.ximai.common.annotation.Log;
import com.ximai.common.enums.BusinessStatus; import com.ximai.common.enums.BusinessStatus;
import com.ximai.common.enums.HttpMethod; import com.ximai.common.enums.HttpMethod;
...@@ -45,11 +47,11 @@ public class ApiLogAspect { ...@@ -45,11 +47,11 @@ public class ApiLogAspect {
* *
* @param joinPoint 切点 * @param joinPoint 切点
*/ */
@AfterReturning(pointcut = "execution(* com.ximai.mes.restful.*.*(..))", returning = "jsonResult") @AfterReturning(pointcut = "@annotation(apiLog)", returning = "jsonResult")
public void doAfterReturning(JoinPoint joinPoint, Object jsonResult) { public void doAfterReturning(JoinPoint joinPoint, ApiLog apiLog, Object jsonResult) {
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
Method method = methodSignature.getMethod(); Method method = methodSignature.getMethod();
Log controllerLog = method.getAnnotation(Log.class); ApiLog controllerLog = method.getAnnotation(ApiLog.class);
ApiOperation apiOperation = method.getAnnotation(ApiOperation.class); ApiOperation apiOperation = method.getAnnotation(ApiOperation.class);
LogInfo logInfo = new LogInfo(); LogInfo logInfo = new LogInfo();
if (controllerLog != null) { if (controllerLog != null) {
...@@ -67,11 +69,11 @@ public class ApiLogAspect { ...@@ -67,11 +69,11 @@ public class ApiLogAspect {
* @param joinPoint 切点 * @param joinPoint 切点
* @param e 异常 * @param e 异常
*/ */
@AfterThrowing(value = "execution(* com.ximai.mes.restful.*.*(..))", throwing = "e") @AfterThrowing(value = "@annotation(apiLog)", throwing = "e")
public void doAfterThrowing(JoinPoint joinPoint, Exception e) { public void doAfterThrowing(JoinPoint joinPoint,ApiLog apiLog, Exception e) {
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
Method method = methodSignature.getMethod(); Method method = methodSignature.getMethod();
Log controllerLog = method.getAnnotation(Log.class); ApiLog controllerLog = method.getAnnotation(ApiLog.class);
ApiOperation apiOperation = method.getAnnotation(ApiOperation.class); ApiOperation apiOperation = method.getAnnotation(ApiOperation.class);
LogInfo logInfo = new LogInfo(); LogInfo logInfo = new LogInfo();
if (controllerLog != null) { if (controllerLog != null) {
...@@ -83,7 +85,7 @@ public class ApiLogAspect { ...@@ -83,7 +85,7 @@ public class ApiLogAspect {
handleLog(joinPoint, logInfo, e, null); handleLog(joinPoint, logInfo, e, null);
} }
private LogInfo convertLogInfo(Log controllerLog) { private LogInfo convertLogInfo(ApiLog controllerLog) {
LogInfo logInfo = new LogInfo(); LogInfo logInfo = new LogInfo();
logInfo.setBusinessType(controllerLog.businessType()); logInfo.setBusinessType(controllerLog.businessType());
logInfo.setSaveRequestData(controllerLog.isSaveRequestData()); logInfo.setSaveRequestData(controllerLog.isSaveRequestData());
...@@ -98,21 +100,25 @@ public class ApiLogAspect { ...@@ -98,21 +100,25 @@ public class ApiLogAspect {
SysApiLog operLog = new SysApiLog(); SysApiLog operLog = new SysApiLog();
operLog.setStatus(BusinessStatus.SUCCESS.ordinal()); operLog.setStatus(BusinessStatus.SUCCESS.ordinal());
// 请求的地址 // 请求的地址
String ip = IpUtils.getIpAddr(ServletUtils.getRequest()); HttpServletRequest request = ServletUtils.getRequest();
operLog.setOperIp(ip); if(ObjectUtil.isNotEmpty(request)){
operLog.setOperUrl(ServletUtils.getRequest().getRequestURI()); String ip = IpUtils.getIpAddr(request);
operLog.setOperIp(ip);
operLog.setOperUrl(request.getRequestURI());
}
if (e != null) { if (e != null) {
operLog.setStatus(BusinessStatus.FAIL.ordinal()); operLog.setStatus(BusinessStatus.FAIL.ordinal());
operLog.setErrorMsg(StringUtils.substring(e.getMessage(), 0, 2000)); operLog.setErrorMsg(StringUtils.substring(e.getMessage(), 0, 2000));
} }
// 设置方法名称 // 设置方法名称
String className = joinPoint.getTarget().getClass().getName(); String className = joinPoint.getSignature().getDeclaringType().getName();
String methodName = joinPoint.getSignature().getName(); String methodName = joinPoint.getSignature().getName();
operLog.setMethod(className + "." + methodName + "()"); operLog.setMethod(className + "." + methodName + "()");
// 设置请求方式 // 设置请求方式
operLog.setRequestMethod(ServletUtils.getRequest().getMethod()); if(ObjectUtil.isNotEmpty(request)) {
operLog.setRequestMethod(request.getMethod());
}
// 处理设置注解上的参数 // 处理设置注解上的参数
getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult); getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult);
// 保存数据库 // 保存数据库
...@@ -126,9 +132,7 @@ public class ApiLogAspect { ...@@ -126,9 +132,7 @@ public class ApiLogAspect {
}); });
} catch (Exception exp) { } catch (Exception exp) {
// 记录本地异常日志 // 记录本地异常日志
log.error("==前置通知异常=="); log.error("ApiLog前置通知异常:", exp);
log.error("异常信息:{}", exp.getMessage());
exp.printStackTrace();
} }
} }
...@@ -162,14 +166,8 @@ public class ApiLogAspect { ...@@ -162,14 +166,8 @@ public class ApiLogAspect {
* @throws Exception 异常 * @throws Exception 异常
*/ */
private void setRequestValue(JoinPoint joinPoint, SysApiLog operLog) throws Exception { private void setRequestValue(JoinPoint joinPoint, SysApiLog operLog) throws Exception {
String requestMethod = operLog.getRequestMethod(); String params = argsArrayToString(joinPoint.getArgs());
if (HttpMethod.PUT.name().equals(requestMethod) || HttpMethod.POST.name().equals(requestMethod)) { operLog.setOperParam(params);
String params = argsArrayToString(joinPoint.getArgs());
operLog.setOperParam(params);
} else {
Map<?, ?> paramsMap = (Map<?, ?>) ServletUtils.getRequest().getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
operLog.setOperParam(paramsMap.toString());
}
} }
/** /**
......
package com.ximai.mes.config;
import com.ximai.system.service.ISysConfigService;
import feign.Logger;
import feign.Request;
import feign.RequestInterceptor;
import feign.Retryer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
public class EPConfiguration {
@Autowired
private ISysConfigService configService;
@Bean
public RequestInterceptor headerInterceptor() {
return template -> {
template.header("X-Authentication", "e10adc3949ba59abbe56e057f20f883e ");
template.header("Content-Type", "application/json;charset=UTF-8 ");
};
}
@Bean
@ConditionalOnMissingBean //这里如果不加@ConditionalOnMissingBean那么独立配置是无法生效的,原理在后面补充
public Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
@Bean
Request.Options feignOptions() {
// 设置连接超时时间为2秒,设置读取超时时间为5秒
return new Request.Options(20 * 1000, 50 * 1000);
}
@Bean
public Retryer feignRetryer() {
//最大请求次数为5,初始间隔时间为100ms,下次间隔时间1.5倍递增,重试间最大间隔时间为1s,
return new Retryer.Default();
}
}
...@@ -25,5 +25,6 @@ public class FeignConfiguration implements RequestInterceptor { ...@@ -25,5 +25,6 @@ public class FeignConfiguration implements RequestInterceptor {
requestTemplate.header("Content-type", "application/json;charset=utf-8"); requestTemplate.header("Content-type", "application/json;charset=utf-8");
String usernameAndPassword = userName + ":" + passWord; String usernameAndPassword = userName + ":" + passWord;
requestTemplate.header("Authorization", "Basic " + Base64.getEncoder().encodeToString(usernameAndPassword.getBytes())); requestTemplate.header("Authorization", "Basic " + Base64.getEncoder().encodeToString(usernameAndPassword.getBytes()));
} }
} }
package com.ximai.mes.config; package com.ximai.mes.config;
import com.ximai.mes.remote.config.CustomResponseEntityDecoder;
import com.ximai.system.service.ISysConfigService; import com.ximai.system.service.ISysConfigService;
import feign.Logger; import feign.Logger;
import feign.Request; import feign.Request;
import feign.RequestInterceptor; import feign.RequestInterceptor;
import feign.Retryer; import feign.Retryer;
import feign.codec.Decoder;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import java.util.Base64; import java.util.Base64;
...@@ -44,5 +48,9 @@ public class FooConfiguration { ...@@ -44,5 +48,9 @@ public class FooConfiguration {
return new Retryer.Default(); return new Retryer.Default();
} }
@Bean
public Decoder decoder(ObjectFactory<HttpMessageConverters> messageConverters){
return new CustomResponseEntityDecoder(messageConverters);
}
} }
...@@ -380,7 +380,8 @@ public class ProWorkorderController extends BaseController { ...@@ -380,7 +380,8 @@ public class ProWorkorderController extends BaseController {
*/ */
@GetMapping(value = "/setStatus/{workorderId}") @GetMapping(value = "/setStatus/{workorderId}")
public void setStaus(@PathVariable("workorderId") Long workorderId) { public void setStaus(@PathVariable("workorderId") Long workorderId) {
proWorkorderService.updateProWorkorderStatus(Collections.singletonList(workorderId), WorkorderStatusEnum.PUBLISHED); ProWorkorder workorder = proWorkorderService.selectWorkorderById(workorderId);
proWorkorderService.updateWorkorderState(workorder, WorkorderStatusEnum.PUBLISHED);
} }
@PostMapping(value = "/proofMakeProduction") @PostMapping(value = "/proofMakeProduction")
......
...@@ -2,6 +2,7 @@ package com.ximai.mes.pro.schedule.impl; ...@@ -2,6 +2,7 @@ package com.ximai.mes.pro.schedule.impl;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.StopWatch; import cn.hutool.core.date.StopWatch;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ximai.common.exception.ServiceException; import com.ximai.common.exception.ServiceException;
import com.ximai.common.utils.MessageUtils; import com.ximai.common.utils.MessageUtils;
...@@ -116,6 +117,9 @@ public class AlgorithmDataSourceImpl implements AlgorithmDataSource { ...@@ -116,6 +117,9 @@ public class AlgorithmDataSourceImpl implements AlgorithmDataSource {
List<ProWorkorder> list = new ArrayList<>(); List<ProWorkorder> list = new ArrayList<>();
list.add(workorder); list.add(workorder);
scheduleJobGroup.setWorkorderList(list); scheduleJobGroup.setWorkorderList(list);
if(ObjectUtil.isEmpty(workorder.getRequestDate())){
throw new ServiceException(MessageUtils.message("pro.workOrder.error.not.null.requestDate"));
}
LocalDateTime recentDate = list.stream().map(s -> DateUtil.toLocalDateTime(s.getRequestDate())).min(Comparator.comparing(LocalDateTime::toLocalDate)).get(); LocalDateTime recentDate = list.stream().map(s -> DateUtil.toLocalDateTime(s.getRequestDate())).min(Comparator.comparing(LocalDateTime::toLocalDate)).get();
scheduleJobGroup.setQuantity(workorderScheduleParamsMap.get(workorder.getWorkorderId()).getScheduleQuantity()); scheduleJobGroup.setQuantity(workorderScheduleParamsMap.get(workorder.getWorkorderId()).getScheduleQuantity());
scheduleJobGroup.setDemandDate(recentDate); scheduleJobGroup.setDemandDate(recentDate);
......
...@@ -20,11 +20,11 @@ import com.ximai.common.utils.data.DataUtil; ...@@ -20,11 +20,11 @@ import com.ximai.common.utils.data.DataUtil;
import com.ximai.common.utils.data.DateUtils; import com.ximai.common.utils.data.DateUtils;
import com.ximai.common.utils.data.ExceptionUtil; import com.ximai.common.utils.data.ExceptionUtil;
import com.ximai.common.utils.data.StringUtils; import com.ximai.common.utils.data.StringUtils;
import com.ximai.mes.aspect.MethodExtendedProcess;
import com.ximai.mes.aspect.MethodExtendedProcesses;
import com.ximai.mes.constant.*; import com.ximai.mes.constant.*;
import com.ximai.mes.md.domain.MdItem; import com.ximai.mes.md.domain.MdItem;
import com.ximai.mes.md.domain.MdProductBom; import com.ximai.mes.md.domain.MdProductBom;
import com.ximai.mes.md.dto.MdItemWarehouseCreate;
import com.ximai.mes.md.dto.MdItemWarehouseDto;
import com.ximai.mes.md.mapper.MdItemMapper; import com.ximai.mes.md.mapper.MdItemMapper;
import com.ximai.mes.md.service.IMdBaseInfoService; import com.ximai.mes.md.service.IMdBaseInfoService;
import com.ximai.mes.md.service.IMdItemService; import com.ximai.mes.md.service.IMdItemService;
...@@ -53,6 +53,8 @@ import com.ximai.mes.pro.service.task.IProTaskService; ...@@ -53,6 +53,8 @@ import com.ximai.mes.pro.service.task.IProTaskService;
import com.ximai.mes.pro.service.task.IProTaskWorkunitService; import com.ximai.mes.pro.service.task.IProTaskWorkunitService;
import com.ximai.mes.remote.ErpService; import com.ximai.mes.remote.ErpService;
import com.ximai.mes.remote.dto.*; import com.ximai.mes.remote.dto.*;
import com.ximai.mes.remote.process.FinishStockInCreateProcess;
import com.ximai.mes.remote.process.WorkorderStateUpdateProcess;
import com.ximai.mes.tm.domain.TmTool; import com.ximai.mes.tm.domain.TmTool;
import com.ximai.mes.tm.mapper.TmToolMapper; import com.ximai.mes.tm.mapper.TmToolMapper;
import com.ximai.mes.wm.domain.WmIssueHeader; import com.ximai.mes.wm.domain.WmIssueHeader;
...@@ -76,7 +78,6 @@ import java.io.IOException; ...@@ -76,7 +78,6 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.*; import java.util.*;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static com.ximai.common.constant.Constants.DateConstant.DATETIME_PATTERN; import static com.ximai.common.constant.Constants.DateConstant.DATETIME_PATTERN;
...@@ -988,12 +989,6 @@ public class ProWorkorderServiceImpl implements IProWorkorderService { ...@@ -988,12 +989,6 @@ public class ProWorkorderServiceImpl implements IProWorkorderService {
proWorkorder.setEpItemCode(proWorkorder.getProductCode()); proWorkorder.setEpItemCode(proWorkorder.getProductCode());
} }
} }
proWorkorder.setQuantityProduced(BigDecimal.ZERO);
proWorkorder.setQuantityQualify(BigDecimal.ZERO);
proWorkorder.setQuantityUnqualify(BigDecimal.ZERO);
proWorkorder.setQuantityScheduled(BigDecimal.ZERO);
proWorkorder.setBatchSerial(1);
int i = this.insertProWorkorder(proWorkorder); int i = this.insertProWorkorder(proWorkorder);
//新增生产工单BOM表 //新增生产工单BOM表
...@@ -1073,6 +1068,11 @@ public class ProWorkorderServiceImpl implements IProWorkorderService { ...@@ -1073,6 +1068,11 @@ public class ProWorkorderServiceImpl implements IProWorkorderService {
} }
proWorkorder.setStatus(WorkorderStatusEnum.PUBLISHED.getValue()); proWorkorder.setStatus(WorkorderStatusEnum.PUBLISHED.getValue());
proWorkorder.createAction(); proWorkorder.createAction();
proWorkorder.setQuantityProduced(BigDecimal.ZERO);
proWorkorder.setQuantityQualify(BigDecimal.ZERO);
proWorkorder.setQuantityUnqualify(BigDecimal.ZERO);
proWorkorder.setQuantityScheduled(BigDecimal.ZERO);
proWorkorder.setBatchSerial(1);
int r = proWorkorderMapper.insertProWorkorder(proWorkorder); int r = proWorkorderMapper.insertProWorkorder(proWorkorder);
//未设置生产版本时自动根据产品编号匹配最新生产版本 //未设置生产版本时自动根据产品编号匹配最新生产版本
if(ObjectUtil.isEmpty(proWorkorder.getProductionSolutionId())){ if(ObjectUtil.isEmpty(proWorkorder.getProductionSolutionId())){
...@@ -1263,22 +1263,6 @@ public class ProWorkorderServiceImpl implements IProWorkorderService { ...@@ -1263,22 +1263,6 @@ public class ProWorkorderServiceImpl implements IProWorkorderService {
return i; return i;
} }
/**
* 查询生产工单
*
* @param workorderIds 生产工单主键
* @return 生产工单
*/
@Override
public void updateProWorkorderStatus(List<Long> workorderIds, WorkorderStatusEnum workOrderStatusEnum) {
for (Long id : workorderIds) {
ProWorkorder proWorkorder = proWorkorderMapper.selectWorkorderById(id);
proWorkorder.setStatus(workOrderStatusEnum.getValue());
this.updateProWorkorder(proWorkorder);
}
}
@Override @Override
public List<ProWorkOrderProcessToolLoseVo> checkToolNum(Long[] workOrderIds) { public List<ProWorkOrderProcessToolLoseVo> checkToolNum(Long[] workOrderIds) {
ExceptionUtil.checkTrueThrowException(CollectionUtil.isEmpty(Arrays.asList(workOrderIds)), MessageUtils.message("pro.tool.error.error27")); ExceptionUtil.checkTrueThrowException(CollectionUtil.isEmpty(Arrays.asList(workOrderIds)), MessageUtils.message("pro.tool.error.error27"));
...@@ -1315,7 +1299,8 @@ public class ProWorkorderServiceImpl implements IProWorkorderService { ...@@ -1315,7 +1299,8 @@ public class ProWorkorderServiceImpl implements IProWorkorderService {
} }
}); });
} }
//修改工单状态
proWorkorderService.updateWorkorderState(proWorkorder, WorkorderStatusEnum.PUBLISHED);
} }
...@@ -1329,8 +1314,6 @@ public class ProWorkorderServiceImpl implements IProWorkorderService { ...@@ -1329,8 +1314,6 @@ public class ProWorkorderServiceImpl implements IProWorkorderService {
throw new ServiceException(buffer.toString()); throw new ServiceException(buffer.toString());
} }
//修改工单状态
proWorkorderService.updateProWorkorderStatus(Arrays.asList(workOrderIds), WorkorderStatusEnum.PUBLISHED);
return rst; return rst;
} }
...@@ -1819,6 +1802,9 @@ public class ProWorkorderServiceImpl implements IProWorkorderService { ...@@ -1819,6 +1802,9 @@ public class ProWorkorderServiceImpl implements IProWorkorderService {
} }
workorderId = dbList.get(0).getWorkorderId(); workorderId = dbList.get(0).getWorkorderId();
} }
if(ObjectUtil.isEmpty(workorderId)){
return;
}
//保存BOM明细 //保存BOM明细
List<ProWorkorderBomErpDto> detailList = s.getWorkorderBomList(); List<ProWorkorderBomErpDto> detailList = s.getWorkorderBomList();
ProWorkOrderBom workOrderBomQuery = new ProWorkOrderBom(); ProWorkOrderBom workOrderBomQuery = new ProWorkOrderBom();
...@@ -1855,4 +1841,29 @@ public class ProWorkorderServiceImpl implements IProWorkorderService { ...@@ -1855,4 +1841,29 @@ public class ProWorkorderServiceImpl implements IProWorkorderService {
throw new ServiceException(rst.getErrorMessage()); throw new ServiceException(rst.getErrorMessage());
} }
} }
@MethodExtendedProcesses(config ={
@MethodExtendedProcess(sysSwitchParam = "erp.finish.stockin.create.enable", processClz = FinishStockInCreateProcess.class,
newThread = true, errorCatch = true)
})
@Override
public void reportUpdateProWorkorder(ProWorkorder workorder, BigDecimal qualifyQuantity, BigDecimal unQualifyQuantity) {
workorder.setQuantityQualify(workorder.getQuantityQualify().add(qualifyQuantity));
workorder.setQuantityUnqualify(workorder.getQuantityUnqualify().add(unQualifyQuantity));
workorder.setQuantityProduced(DataUtil.getNormalData(workorder.getQuantityProduced()).add(qualifyQuantity));
if(workorder.getQuantityProduced().compareTo(workorder.getQuantity())>=0){
proWorkorderService.updateWorkorderState(workorder, WorkorderStatusEnum.FINISHED);
}
proWorkorderService.updateProWorkorder(workorder);
}
@MethodExtendedProcesses(config ={
@MethodExtendedProcess(sysSwitchParam = "erp.workorder.state.update", processClz = WorkorderStateUpdateProcess.class,
newThread = true, errorCatch = true)
})
@Override
public void updateWorkorderState(ProWorkorder workorder, WorkorderStatusEnum workorderStatusEnum){
workorder.setStatus(workorderStatusEnum.getValue());
proWorkorderService.updateProWorkorder(workorder);
}
} }
...@@ -5,7 +5,6 @@ import cn.hutool.core.collection.CollectionUtil; ...@@ -5,7 +5,6 @@ import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.StopWatch; import cn.hutool.core.date.StopWatch;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ximai.common.constant.UserConstants; import com.ximai.common.constant.UserConstants;
import com.ximai.common.exception.ServiceException;
import com.ximai.common.utils.MessageUtils; import com.ximai.common.utils.MessageUtils;
import com.ximai.common.utils.SecurityUtils; import com.ximai.common.utils.SecurityUtils;
import com.ximai.common.utils.data.DataUtil; import com.ximai.common.utils.data.DataUtil;
...@@ -815,47 +814,29 @@ public class ProTaskServiceImpl implements IProTaskService { ...@@ -815,47 +814,29 @@ public class ProTaskServiceImpl implements IProTaskService {
} }
} }
} }
if (workorderId != null && workorderId != 0) { // 查看当前工单已报工数量
// 查看当前工单已报工数量 if (proWorkorders.size() == 1) {
if (proWorkorders.size() == 1) { if (feedbackQualityDouConst >= task.getQuantity().doubleValue() || taskQuantityWaitDouConst == 0) {
if (feedbackQualityDouConst >= task.getQuantity().doubleValue() || taskQuantityWaitDouConst == 0) {
taskWorkunit.setStatus(FINISHED.getStatus());
}
// 判断已经报工数和未报工数
if (execQuantityQualifySumConst >= 0) {
// 第一次进入
if (maxWorkunitQuantityConst > execQuantityQualifySumConst) {
// 工单大于已报工数量 工单减去已报工数量
feedbackQualityVal = new BigDecimal(maxWorkunitQuantityConst - execQuantityQualifySumConst);
// 报工数量大于可报工数量取报工数量
if (feedbackQualityVal.doubleValue() > feedbackQualityDouConst) {
feedbackQualityVal = feedbackQualifyConst;
}
} else {
feedbackQualityVal = BigDecimal.valueOf(Math.min(maxWorkunitQuantityConst, feedbackQualityDouConst));
}
}
quantityWaitVal = taskQuantityWaitConst.subtract(feedbackQualityVal);
}
} else {
// 工单数量数量小于或者等于已报工数量 报工数量 大于等待数量 否则
double v1 = maxWorkunitQuantityConst - execQuantityQualifySumConst;
if (feedbackQualityDouConst >= v1) {
taskWorkunit.setStatus(FINISHED.getStatus()); taskWorkunit.setStatus(FINISHED.getStatus());
feedbackQualityVal = BigDecimal.valueOf(v1);
} }
if (feedbackQualityDouConst > taskQuantityWaitDouConst) { // 判断已经报工数和未报工数
feedbackQualityVal = taskQuantityWaitConst; if (execQuantityQualifySumConst >= 0) {
// 第一次进入
if (maxWorkunitQuantityConst > execQuantityQualifySumConst) {
// 工单大于已报工数量 工单减去已报工数量
feedbackQualityVal = new BigDecimal(maxWorkunitQuantityConst - execQuantityQualifySumConst);
// 报工数量大于可报工数量取报工数量
if (feedbackQualityVal.doubleValue() > feedbackQualityDouConst) {
feedbackQualityVal = feedbackQualifyConst;
}
} else {
feedbackQualityVal = BigDecimal.valueOf(Math.min(maxWorkunitQuantityConst, feedbackQualityDouConst));
}
} }
quantityWaitVal = taskQuantityWaitConst.subtract(feedbackQualityVal); quantityWaitVal = taskQuantityWaitConst.subtract(feedbackQualityVal);
} }
task.setQuantityWait(quantityWaitVal.doubleValue() < 0D ? BigDecimal.ZERO : quantityWaitVal); task.setQuantityWait(quantityWaitVal.doubleValue() < 0D ? BigDecimal.ZERO : quantityWaitVal);
task.setQuantityProduced(DataUtil.getNormalData(task.getQuantityProduced()).add(feedbackQualityVal)); task.setQuantityProduced(DataUtil.getNormalData(task.getQuantityProduced()).add(feedbackQualityVal));
task.setQuantityQualify(DataUtil.getNormalData(task.getQuantityQualify()).add(feedbackQualityVal)); task.setQuantityQualify(DataUtil.getNormalData(task.getQuantityQualify()).add(feedbackQualityVal));
...@@ -878,7 +859,6 @@ public class ProTaskServiceImpl implements IProTaskService { ...@@ -878,7 +859,6 @@ public class ProTaskServiceImpl implements IProTaskService {
feedback.setWorkunitId(taskWorkunit.getWorkunitId()); feedback.setWorkunitId(taskWorkunit.getWorkunitId());
feedback.setNickName(sysUserMapper.selectUserById(SecurityUtils.getUserId()).getNickName()); feedback.setNickName(sysUserMapper.selectUserById(SecurityUtils.getUserId()).getNickName());
//暂停更新记录 //暂停更新记录
if (Objects.equals(taskWorkunit.getStatus(), FINISHED.getStatus())) { if (Objects.equals(taskWorkunit.getStatus(), FINISHED.getStatus())) {
proStartWorkService.closeObj(feedback); proStartWorkService.closeObj(feedback);
...@@ -905,26 +885,16 @@ public class ProTaskServiceImpl implements IProTaskService { ...@@ -905,26 +885,16 @@ public class ProTaskServiceImpl implements IProTaskService {
//如果为最后一道工序,回写工单数量 //如果为最后一道工序,回写工单数量
if (StringUtils.isEmpty(nextTask)) { if (StringUtils.isEmpty(nextTask)) {
feedbackWorkorder.forEach((k, v) -> { feedbackWorkorder.forEach((k, v) -> {
ProWorkorder workorder = v.getWorkorder(); proWorkorderService.reportUpdateProWorkorder(v.getWorkorder(), v.getQuantityQualify(), v.getQuantityUnqualify());
workorder.setQuantityQualify(workorder.getQuantityQualify().add(v.getQuantityQualify()));
workorder.setQuantityUnqualify(workorder.getQuantityUnqualify().add(v.getQuantityUnqualify()));
workorder.setQuantityProduced(DataUtil.getNormalData(workorder.getQuantityProduced()).add(v.getQuantityQualify()));
proWorkorderService.updateProWorkorder(workorder);
}); });
} }
} }
proTaskWorkunitService.updateProTaskWorkunit(taskWorkunit); proTaskWorkunitService.updateProTaskWorkunit(taskWorkunit);
//打印记录
if ("1".equals(feedback.getPrintContents())) {
proFdQrcodePrintRecordService.insertProFdQrcodePrintRecordfeedback(feedback);
}
//扣减刀具寿命
proTaskWorkunitService.updateProTaskWorkunitlife(feedback);
//报工满足条件下架刀模版具
tmToolMachinesService.feedbackToolDismount(taskWorkunit);
return response; return response;
} }
@Transactional @Transactional
@Override @Override
public void changeStatus(ProTask proTask) { public void changeStatus(ProTask proTask) {
...@@ -948,20 +918,12 @@ public class ProTaskServiceImpl implements IProTaskService { ...@@ -948,20 +918,12 @@ public class ProTaskServiceImpl implements IProTaskService {
proTasks = proTaskMapper.selectProTaskVoList(taskWorkunitId, task.getArrangeCode()); proTasks = proTaskMapper.selectProTaskVoList(taskWorkunitId, task.getArrangeCode());
task = proTasks.get(0); task = proTasks.get(0);
proTaskWorkunit.setStatus(proTask.getStatus());
proTaskWorkunitService.updateProTaskWorkunit(proTaskWorkunit);
if (proTask.getStatus().equals(TaskStatusEnum.BEGINNING.getStatus())) { if (proTask.getStatus().equals(TaskStatusEnum.BEGINNING.getStatus())) {
//设置工单状态为生产中 proTaskWorkunit.setStatus(proTask.getStatus());
List<ProWorkorder> orderList = proWorkorderMapper.selectProWorkorderJoinTask(new QueryWrapper<ProWorkorder>().eq("t2.task_id", proTask.getTaskId())); proTaskWorkunitService.updateProTaskWorkunitState(proTaskWorkunit, TaskStatusEnum.get(proTask.getStatus()));
for (ProWorkorder proWorkorder : orderList) {
if (WorkorderStatusEnum.ISSUED.getValue().equals(proWorkorder.getStatus())) {
proWorkorder.setStatus(WorkorderStatusEnum.PRODUCING.getValue());
Long workorderId = proWorkorder.getWorkorderId();
proWorkorderService.updateProWorkorderStatus(Collections.singletonList(workorderId), WorkorderStatusEnum.PRODUCING);
}
}
} }
if (proTask.getStatus().equals(TaskStatusEnum.FINISHED.getStatus())) { if (proTask.getStatus().equals(TaskStatusEnum.FINISHED.getStatus())) {
......
...@@ -3,24 +3,20 @@ package com.ximai.mes.pro.service.impl.task; ...@@ -3,24 +3,20 @@ package com.ximai.mes.pro.service.impl.task;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ximai.common.core.domain.BaseEntity;
import com.ximai.common.core.domain.entity.SysUser;
import com.ximai.common.exception.ServiceException; import com.ximai.common.exception.ServiceException;
import com.ximai.common.utils.MessageUtils; import com.ximai.common.utils.MessageUtils;
import com.ximai.common.utils.data.DataUtil;
import com.ximai.common.utils.data.ExceptionUtil; import com.ximai.common.utils.data.ExceptionUtil;
import com.ximai.common.utils.data.StringUtils; import com.ximai.common.utils.data.StringUtils;
import com.ximai.mes.aspect.MethodExtendedProcess;
import com.ximai.mes.aspect.MethodExtendedProcesses;
import com.ximai.mes.constant.*; import com.ximai.mes.constant.*;
import com.ximai.mes.md.domain.MdWorkunit;
import com.ximai.mes.md.mapper.MdWorkunitMapper; import com.ximai.mes.md.mapper.MdWorkunitMapper;
import com.ximai.mes.md.service.IMdWorkunitService; import com.ximai.mes.md.service.IMdWorkunitService;
import com.ximai.mes.pro.domain.ProArrange;
import com.ximai.mes.pro.domain.ProFeedback; import com.ximai.mes.pro.domain.ProFeedback;
import com.ximai.mes.pro.domain.proWorkOrder.ProWorkorder; import com.ximai.mes.pro.domain.proWorkOrder.ProWorkorder;
import com.ximai.mes.pro.domain.task.*; import com.ximai.mes.pro.domain.task.*;
import com.ximai.mes.pro.domain.vo.ProTaskVo;
import com.ximai.mes.pro.domain.vo.task.ProTaskWorkunitQuery; import com.ximai.mes.pro.domain.vo.task.ProTaskWorkunitQuery;
import com.ximai.mes.pro.domain.vo.task.TaskWorkunitOutsourceSplitParam; import com.ximai.mes.pro.domain.vo.task.TaskWorkunitOutsourceSplitParam;
import com.ximai.mes.pro.domain.vo.task.TaskWorkunitToOutsourceParam; import com.ximai.mes.pro.domain.vo.task.TaskWorkunitToOutsourceParam;
...@@ -28,11 +24,13 @@ import com.ximai.mes.pro.domain.vo.task.TaskWorkunitToSelfMadeParam; ...@@ -28,11 +24,13 @@ import com.ximai.mes.pro.domain.vo.task.TaskWorkunitToSelfMadeParam;
import com.ximai.mes.pro.dto.task.ProTaskWorkunitConvertRecordCreate; import com.ximai.mes.pro.dto.task.ProTaskWorkunitConvertRecordCreate;
import com.ximai.mes.pro.mapper.ProArrangeMapper; import com.ximai.mes.pro.mapper.ProArrangeMapper;
import com.ximai.mes.pro.mapper.ProFeedbackMapper; import com.ximai.mes.pro.mapper.ProFeedbackMapper;
import com.ximai.mes.pro.mapper.proWorkOrder.ProWorkorderMapper;
import com.ximai.mes.pro.mapper.task.ProTaskWorkunitMapper; import com.ximai.mes.pro.mapper.task.ProTaskWorkunitMapper;
import com.ximai.mes.pro.service.IProAllocationMaterialService; import com.ximai.mes.pro.service.IProAllocationMaterialService;
import com.ximai.mes.pro.service.IProMaterialRequestService; import com.ximai.mes.pro.service.IProMaterialRequestService;
import com.ximai.mes.pro.service.proWorkOrder.IProWorkorderService; import com.ximai.mes.pro.service.proWorkOrder.IProWorkorderService;
import com.ximai.mes.pro.service.task.*; import com.ximai.mes.pro.service.task.*;
import com.ximai.mes.remote.process.PurchasingRequisitionCreateProcess;
import com.ximai.mes.tm.domain.TmTool; import com.ximai.mes.tm.domain.TmTool;
import com.ximai.mes.tm.domain.TmToolMachines; import com.ximai.mes.tm.domain.TmToolMachines;
import com.ximai.mes.tm.domain.TmToolRequestUseItem; import com.ximai.mes.tm.domain.TmToolRequestUseItem;
...@@ -48,7 +46,6 @@ import org.springframework.transaction.annotation.Transactional; ...@@ -48,7 +46,6 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.*; import java.util.*;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static com.ximai.mes.constant.WorkorderStatusEnum.CLOSE; import static com.ximai.mes.constant.WorkorderStatusEnum.CLOSE;
...@@ -70,7 +67,7 @@ public class ProTaskWorkunitServiceImpl implements IProTaskWorkunitService { ...@@ -70,7 +67,7 @@ public class ProTaskWorkunitServiceImpl implements IProTaskWorkunitService {
@Autowired @Autowired
private IProTaskWorkunitService proTaskWorkunitService; private IProTaskWorkunitService proTaskWorkunitService;
@Resource @Resource
private ProArrangeMapper proArrangeMapper; private ProWorkorderMapper proWorkorderMapper;
@Resource @Resource
private SysUserMapper sysUserMapper; private SysUserMapper sysUserMapper;
...@@ -189,6 +186,22 @@ public class ProTaskWorkunitServiceImpl implements IProTaskWorkunitService { ...@@ -189,6 +186,22 @@ public class ProTaskWorkunitServiceImpl implements IProTaskWorkunitService {
return proTaskWorkunitMapper.updateProTaskWorkunit(proTaskWorkunit); return proTaskWorkunitMapper.updateProTaskWorkunit(proTaskWorkunit);
} }
@Override
public void updateProTaskWorkunitState(ProTaskWorkunit proTaskWorkunit, TaskStatusEnum taskStatusEnum) {
if(taskStatusEnum == TaskStatusEnum.BEGINNING){
//判断是否设置工单开工
List<ProWorkorder> orderList = proWorkorderMapper.selectProWorkorderJoinTask(new QueryWrapper<ProWorkorder>().eq("t2.task_id", proTaskWorkunit.getTaskId()));
for (ProWorkorder proWorkorder : orderList) {
if (WorkorderStatusEnum.ISSUED.getValue().equals(proWorkorder.getStatus())) {
proWorkorder.setStatus(WorkorderStatusEnum.PRODUCING.getValue());
proWorkorderService.updateWorkorderState(proWorkorder, WorkorderStatusEnum.PRODUCING);
}
}
}
proTaskWorkunit.setStatus(taskStatusEnum.getStatus());
this.updateProTaskWorkunit(proTaskWorkunit);
}
/** /**
* 修改任务工作单元 * 修改任务工作单元
* *
...@@ -412,6 +425,7 @@ public class ProTaskWorkunitServiceImpl implements IProTaskWorkunitService { ...@@ -412,6 +425,7 @@ public class ProTaskWorkunitServiceImpl implements IProTaskWorkunitService {
query.le(proTaskWorkunit.getScheduleEndDateTo() != null, "ptw.schedule_start_date", proTaskWorkunit.getScheduleEndDateTo()); query.le(proTaskWorkunit.getScheduleEndDateTo() != null, "ptw.schedule_start_date", proTaskWorkunit.getScheduleEndDateTo());
query.eq(StringUtils.isNotEmpty(proTaskWorkunit.getArrangeCode()), "t.arrange_code", proTaskWorkunit.getArrangeCode()); query.eq(StringUtils.isNotEmpty(proTaskWorkunit.getArrangeCode()), "t.arrange_code", proTaskWorkunit.getArrangeCode());
query.eq(proTaskWorkunit.getOutsourced()!=null, "ptw.outsourced", proTaskWorkunit.getOutsourced()); query.eq(proTaskWorkunit.getOutsourced()!=null, "ptw.outsourced", proTaskWorkunit.getOutsourced());
query.gt("ptw.quantity",0);
query.orderByAsc("schedule_start_date"); query.orderByAsc("schedule_start_date");
List<ProTaskWorkunit> list = proTaskWorkunitService.selectTaskWorkUnitJoinTask(query); List<ProTaskWorkunit> list = proTaskWorkunitService.selectTaskWorkUnitJoinTask(query);
return list; return list;
...@@ -521,9 +535,21 @@ public class ProTaskWorkunitServiceImpl implements IProTaskWorkunitService { ...@@ -521,9 +535,21 @@ public class ProTaskWorkunitServiceImpl implements IProTaskWorkunitService {
if(taskWorkunit.getVendorId()==null){ if(taskWorkunit.getVendorId()==null){
throw new ServiceException(MessageUtils.message("pro.schedule.error.not.null.vendor")); throw new ServiceException(MessageUtils.message("pro.schedule.error.not.null.vendor"));
} }
taskWorkunit.setOutsourced(1); if(ObjectUtil.equal(taskWorkunit.getOutsourced(), 1)){
taskWorkunit.setStatus(TaskStatusEnum.BEGINNING.getStatus()); throw new ServiceException(MessageUtils.message("basic.error.repeat.confirm"));
this.updateProTaskWorkunit(taskWorkunit); }
proTaskWorkunitService.outsourceConfirm(taskWorkunit);
}); });
} }
@MethodExtendedProcesses(config ={
@MethodExtendedProcess(sysSwitchParam = "erp.purchasing.requisition.create.enable", processClz = PurchasingRequisitionCreateProcess.class,
newThread = true, errorCatch = true)
})
@Override
public void outsourceConfirm(ProTaskWorkunit taskWorkunit) {
taskWorkunit.setOutsourced(1);
this.updateProTaskWorkunit(taskWorkunit);
this.updateProTaskWorkunitState(taskWorkunit, TaskStatusEnum.BEGINNING);
}
} }
...@@ -16,6 +16,7 @@ import org.springframework.web.multipart.MultipartFile; ...@@ -16,6 +16,7 @@ import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.math.BigDecimal;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -91,6 +92,19 @@ public interface IProWorkorderService { ...@@ -91,6 +92,19 @@ public interface IProWorkorderService {
*/ */
int insertProWorkorderVo(ProWorkorderVo proWorkorderVo); int insertProWorkorderVo(ProWorkorderVo proWorkorderVo);
/**
* 生产完工,更新工单数量信息
*
* @param proWorkorder 生产工单
* @param qualifyQuantity 完工数量
* @param unQualifyQuantity 不合格数量
* @return 结果
*/
void reportUpdateProWorkorder(ProWorkorder proWorkorder, BigDecimal qualifyQuantity, BigDecimal unQualifyQuantity);
void updateWorkorderState(ProWorkorder workorder, WorkorderStatusEnum workorderStatusEnum);
/** /**
* 修改生产工单 * 修改生产工单
* *
...@@ -132,15 +146,6 @@ public interface IProWorkorderService { ...@@ -132,15 +146,6 @@ public interface IProWorkorderService {
*/ */
int updateProWorkorderWithBomAndProcess(ProWorkorderVo proWorkorderVo); int updateProWorkorderWithBomAndProcess(ProWorkorderVo proWorkorderVo);
/**
* 修改生产工单方法
*
* @param workorderId 生产工单主键 status 工单状态
* @return 生产工单
*/
void updateProWorkorderStatus(List<Long> workorderId, WorkorderStatusEnum workOrderStatusEnum);
/** /**
* 工单工装齐套检查 * 工单工装齐套检查
* *
......
package com.ximai.mes.pro.service.task; package com.ximai.mes.pro.service.task;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ximai.mes.constant.TaskStatusEnum;
import com.ximai.mes.pro.domain.ProFeedback; import com.ximai.mes.pro.domain.ProFeedback;
import com.ximai.mes.pro.domain.proWorkOrder.ProWorkorder; import com.ximai.mes.pro.domain.proWorkOrder.ProWorkorder;
import com.ximai.mes.pro.domain.task.ProTaskWorkunit; import com.ximai.mes.pro.domain.task.ProTaskWorkunit;
...@@ -68,6 +69,14 @@ public interface IProTaskWorkunitService { ...@@ -68,6 +69,14 @@ public interface IProTaskWorkunitService {
*/ */
int updateProTaskWorkunit(ProTaskWorkunit proTaskWorkunit); int updateProTaskWorkunit(ProTaskWorkunit proTaskWorkunit);
/**
* 修改任务工作单元状态
*
* @param proTaskWorkunit 任务工作单元
* @return 结果
*/
void updateProTaskWorkunitState(ProTaskWorkunit proTaskWorkunit, TaskStatusEnum taskStatusEnum);
/** /**
* 修改任务工作单元排产时间、工作单元 * 修改任务工作单元排产时间、工作单元
* *
...@@ -154,4 +163,10 @@ public interface IProTaskWorkunitService { ...@@ -154,4 +163,10 @@ public interface IProTaskWorkunitService {
*/ */
void outsourceConfirm(List<Long> taskWorkunitIds); void outsourceConfirm(List<Long> taskWorkunitIds);
/**
* 委外确认
* @param taskWorkunit
*/
void outsourceConfirm(ProTaskWorkunit taskWorkunit);
} }
package com.ximai.mes.remote; package com.ximai.mes.remote;
import com.ximai.common.annotation.Log; import com.ximai.common.annotation.ApiLog;
import com.ximai.common.enums.BusinessType; import com.ximai.common.enums.BusinessType;
import com.ximai.common.enums.InOutType;
import com.ximai.mes.remote.dto.*; import com.ximai.mes.remote.dto.*;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.cloud.openfeign.FeignClient;
...@@ -15,60 +16,60 @@ import java.util.List; ...@@ -15,60 +16,60 @@ import java.util.List;
@FeignClient(value = "erp-service", url = "${remote.erp.url}") @FeignClient(value = "erp-service", url = "${remote.erp.url}")
public interface ErpService { public interface ErpService {
@Log(businessType = BusinessType.QUERY) @ApiLog(businessType = BusinessType.QUERY, inOutType = InOutType.OUT)
@ApiOperation(value = "查询ERP供应商") @ApiOperation(value = "查询ERP供应商")
@PostMapping(value = "/purma/getPurmaList") @PostMapping(value = "/purma/getPurmaList")
ErpResponseResult<List<MdVendorErpDto>> getVendorList(MdVendorErpQuery vendorErpQuery); ErpResponseResult<List<MdVendorErpDto>> getVendorList(MdVendorErpQuery vendorErpQuery);
@Log(businessType = BusinessType.QUERY) @ApiLog(businessType = BusinessType.QUERY, inOutType = InOutType.OUT)
@ApiOperation(value = "查询ERP客户") @ApiOperation(value = "查询ERP客户")
@PostMapping(value = "/copma/getCopmaList") @PostMapping(value = "/copma/getCopmaList")
ErpResponseResult<List<MdClientErpDto>> getClientList(MdClientErpQuery clientErpQuery); ErpResponseResult<List<MdClientErpDto>> getClientList(MdClientErpQuery clientErpQuery);
@Log(businessType = BusinessType.QUERY) @ApiLog(businessType = BusinessType.QUERY, inOutType = InOutType.OUT)
@ApiOperation(value = "查询ERP仓库") @ApiOperation(value = "查询ERP仓库")
@PostMapping(value = "/cmsmc/getCmsmcList") @PostMapping(value = "/cmsmc/getCmsmcList")
ErpResponseResult<List<WmWarehouseErpDto>> getWarehouseList(WmWarehouseErpQuery warehouseErpQuery); ErpResponseResult<List<WmWarehouseErpDto>> getWarehouseList(WmWarehouseErpQuery warehouseErpQuery);
@Log(businessType = BusinessType.QUERY) @ApiLog(businessType = BusinessType.QUERY, inOutType = InOutType.OUT)
@ApiOperation(value = "查询ERP物料") @ApiOperation(value = "查询ERP物料")
@PostMapping(value = "/invmb/getInvmbList") @PostMapping(value = "/invmb/getInvmbList")
ErpResponseResult<List<MdItemErpDto>> getItemList(MdItemErpQuery itemErpQuery); ErpResponseResult<List<MdItemErpDto>> getItemList(MdItemErpQuery itemErpQuery);
@Log(businessType = BusinessType.QUERY) @ApiLog(businessType = BusinessType.QUERY, inOutType = InOutType.OUT)
@ApiOperation(value = "查询工单") @ApiOperation(value = "查询工单")
@PostMapping(value = "/mocta/getMoctaList") @PostMapping(value = "/mocta/getMoctaList")
ErpResponseResult<List<ProWorkorderErpDto>> getWorkorderList(ProWorkorderErpQuery workorderErpQuery); ErpResponseResult<List<ProWorkorderErpDto>> getWorkorderList(ProWorkorderErpQuery workorderErpQuery);
@Log(businessType = BusinessType.UPDATE) @ApiLog(businessType = BusinessType.UPDATE, inOutType = InOutType.OUT)
@ApiOperation(value = "工单同步标识") @ApiOperation(value = "工单同步标识")
@PostMapping(value = "/mocta/syncMark") @PostMapping(value = "/mocta/syncMark")
ErpResponseResult<Object> workorderSyncMark(ProWorkorderSyncMarkUpdate syncMarkUpdate); ErpResponseResult<Object> workorderSyncMark(ProWorkorderSyncMarkUpdate syncMarkUpdate);
@Log(businessType = BusinessType.UPDATE) @ApiLog(businessType = BusinessType.UPDATE, inOutType = InOutType.OUT)
@ApiOperation(value = "物料同步标识") @ApiOperation(value = "物料同步标识")
@PostMapping(value = "/invmb/syncMark") @PostMapping(value = "/invmb/syncMark")
ErpResponseResult<Object> materialSyncMark(MdItemSyncMarkUpdate syncMarkUpdate); ErpResponseResult<Object> materialSyncMark(MdItemSyncMarkUpdate syncMarkUpdate);
@Log(businessType = BusinessType.UPDATE) @ApiLog(businessType = BusinessType.UPDATE, inOutType = InOutType.OUT)
@ApiOperation(value = "工单状态更新") @ApiOperation(value = "工单状态更新")
@PostMapping(value = "/mocta/updateState") @PostMapping(value = "/mocta/updateState")
ErpResponseResult<Object> updateState(ProWorkorderSyncMarkUpdate syncMarkUpdate); ErpResponseResult<Object> updateWorkorderState(ProWorkorderStateUpdate stateUpdate);
@Log(businessType = BusinessType.UPDATE) @ApiLog(businessType = BusinessType.UPDATE, inOutType = InOutType.OUT)
@ApiOperation(value = "请购单创建") @ApiOperation(value = "请购单创建")
@PostMapping(value = "/purta/create") @PostMapping(value = "/purta/create")
ErpResponseResult<Object> purchasingRequisitionCreate(ProWorkorderSyncMarkUpdate syncMarkUpdate); ErpResponseResult<Object> purchasingRequisitionCreate(PurchasingRequisitionCreate create);
@Log(businessType = BusinessType.UPDATE) @ApiLog(businessType = BusinessType.UPDATE, inOutType = InOutType.OUT)
@ApiOperation(value = "完工入库创建") @ApiOperation(value = "完工入库创建")
@PostMapping(value = "/moctf/create") @PostMapping(value = "/moctf/create")
ErpResponseResult<Object> finishStockInCreate(ProWorkorderSyncMarkUpdate syncMarkUpdate); ErpResponseResult<Object> finishStockInCreate(FinishStockInCreate create);
} }
package com.ximai.mes.remote.config;
import com.ximai.common.exception.ServiceException;
import com.ximai.mes.remote.dto.ErpResponseResult;
import feign.FeignException;
import feign.Response;
import feign.codec.Decoder;
import feign.form.spring.SpringFormEncoder;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.SmartInitializingSingleton;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.cloud.openfeign.support.ResponseEntityDecoder;
import org.springframework.cloud.openfeign.support.SpringDecoder;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.lang.reflect.Type;
@Component
public class CustomResponseEntityDecoder extends SpringDecoder {
public CustomResponseEntityDecoder(ObjectFactory<HttpMessageConverters> messageConverters) {
super(messageConverters);
}
@Override
public Object decode(Response response, Type type) throws IOException, FeignException {
Object obj = super.decode(response, type);
if(obj instanceof ErpResponseResult){
ErpResponseResult result = (ErpResponseResult)obj;
if(!result.isSuccess()){
throw new ServiceException("api error:"+result.getErrorMessage());
}
}
return obj;
}
}
package com.ximai.mes.remote.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* 完工入库 FinishStockInCreate
*
* @date 2024-10-25
*/
@Data
public class FinishStockInCreate
{
@ApiModelProperty("入库单号")
@JsonProperty("tf002")
private String stockInNo;
@ApiModelProperty("备注")
@JsonProperty("tf005")
private String remark;
@ApiModelProperty("明细")
private List<FinishStockInCreateDetail> details;
}
package com.ximai.mes.remote.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* 完工入库 FinishStockInCreate
*
* @date 2024-10-25
*/
@Data
public class FinishStockInCreateDetail
{
@ApiModelProperty("入库单号")
@JsonProperty("tg002")
private String stockInNo;
@ApiModelProperty("入库数量")
@JsonProperty("tg011")
private BigDecimal inQuantity;
@ApiModelProperty("工单单别")
@JsonProperty("tg014")
private String workorderType;
@ApiModelProperty("工单单号")
@JsonProperty("tg015")
private String workorderCode;
@ApiModelProperty("验收数量")
@JsonProperty("tg013")
private BigDecimal checkQuantity;
}
package com.ximai.mes.remote.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 工单对象 ProWorkorderErpQuery
*
* @date 2024-10-18
*/
@Data
public class ProWorkorderStateUpdate
{
@ApiModelProperty("工单单别")
@JsonProperty("ta001")
private String workorderType;
@ApiModelProperty("工单单号")
@JsonProperty("ta002")
private String workorderCode;
/**
* 生产中:3
* 关闭:y
*/
@ApiModelProperty("ERP工单状态")
@JsonProperty("ta011")
private String state;
}
package com.ximai.mes.remote.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* 物料对象 MdItemErpQuery
*
* @date 2024-10-25
*/
@Data
public class PurchasingRequisitionCreate
{
@ApiModelProperty("工单类型")
@JsonProperty("workorderType")
private String workorderType;
@ApiModelProperty("工单号")
@JsonProperty("workorderCode")
private String workorderCode;
@ApiModelProperty("请购单号")
@JsonProperty("ta002")
private String requisitionCode;
@ApiModelProperty("数量合计")
@JsonProperty("ta011")
private BigDecimal totalQuantity;
@ApiModelProperty("明细")
private List<PurchasingRequisitionDetailCreate> details;
}
package com.ximai.mes.remote.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 物料对象 MdItemErpQuery
*
* @date 2024-10-25
*/
@Data
public class PurchasingRequisitionDetailCreate
{
@ApiModelProperty("需求日期")
@JsonProperty("tb011")
private String requestDate;
@ApiModelProperty("委外加工数量")
@JsonProperty("udf11")
private String quantity;
@ApiModelProperty("委外工艺")
@JsonProperty("udf12")
private String processName;
}
package com.ximai.mes.remote.process;
import com.ximai.mes.aspect.IExtendedProcess;
import com.ximai.mes.pro.domain.proWorkOrder.ProWorkorder;
import com.ximai.mes.remote.ErpService;
import com.ximai.mes.remote.dto.FinishStockInCreate;
import com.ximai.mes.remote.dto.FinishStockInCreateDetail;
import com.ximai.system.strategy.AutoCodeUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
@Component
public class FinishStockInCreateProcess implements IExtendedProcess {
@Autowired
ErpService erpService;
@Autowired
private AutoCodeUtil autoCodeUtil;
@Override
public void process(Object[] args, Object returnResult) {
ProWorkorder workorder = (ProWorkorder)args[0];
BigDecimal qualifyQuantity = (BigDecimal)args[1];
String requestCode = autoCodeUtil.genSerialCode("ERP_FINISH_STOCK_IN","");
FinishStockInCreate create = new FinishStockInCreate();
create.setStockInNo(requestCode);
List<FinishStockInCreateDetail> details = new ArrayList<>();
FinishStockInCreateDetail detail = new FinishStockInCreateDetail();
detail.setStockInNo(requestCode);
detail.setWorkorderType(workorder.getWorkorderType());
detail.setWorkorderCode(workorder.getWorkorderCode());
detail.setCheckQuantity(qualifyQuantity);
detail.setInQuantity(qualifyQuantity);
details.add(detail);
create.setDetails(details);
erpService.finishStockInCreate(create);
}
}
package com.ximai.mes.remote.process;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ximai.mes.aspect.IExtendedProcess;
import com.ximai.mes.pro.domain.proWorkOrder.ProWorkorder;
import com.ximai.mes.pro.domain.task.ProTask;
import com.ximai.mes.pro.domain.task.ProTaskWorkunit;
import com.ximai.mes.pro.mapper.proWorkOrder.ProWorkorderMapper;
import com.ximai.mes.pro.service.task.IProTaskService;
import com.ximai.mes.remote.ErpService;
import com.ximai.mes.remote.dto.PurchasingRequisitionCreate;
import com.ximai.mes.remote.dto.PurchasingRequisitionDetailCreate;
import com.ximai.system.strategy.AutoCodeUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component
public class PurchasingRequisitionCreateProcess implements IExtendedProcess {
@Autowired
ErpService erpService;
@Autowired
IProTaskService taskService;
@Autowired
ProWorkorderMapper proWorkorderMapper;
@Autowired
private AutoCodeUtil autoCodeUtil;
@Override
public void process(Object[] args, Object returnResult) {
ProTaskWorkunit taskWorkunit = (ProTaskWorkunit)args[0];
ProTask task = taskService.selectProTaskByTaskId(taskWorkunit.getTaskId());
QueryWrapper<ProWorkorder> workorderQuery = new QueryWrapper<>();
workorderQuery.eq("t2.task_id", task.getTaskId());
List<ProWorkorder> workorderList = proWorkorderMapper.selectProWorkorderJoinTask(workorderQuery);
PurchasingRequisitionCreate create = new PurchasingRequisitionCreate();
String requestCode = autoCodeUtil.genSerialCode("ERP_PURCHASING_REQUISITION","");
if(workorderList.size()>0){
create.setWorkorderType(workorderList.get(0).getWorkorderType());
create.setWorkorderCode(workorderList.get(0).getWorkorderCode());
}
create.setRequisitionCode(requestCode);
create.setTotalQuantity(taskWorkunit.getQuantity());
List<PurchasingRequisitionDetailCreate> details = new ArrayList<>();
PurchasingRequisitionDetailCreate detailCreate = new PurchasingRequisitionDetailCreate();
detailCreate.setQuantity(taskWorkunit.getQuantity()+"");
detailCreate.setProcessName(task.getProcessName());
detailCreate.setRequestDate(DateUtil.format(taskWorkunit.getScheduleEndDate(),"yyyyMMdd"));
details.add(detailCreate);
create.setDetails(details);
erpService.purchasingRequisitionCreate(create);
}
}
package com.ximai.mes.remote.process;
import com.ximai.mes.aspect.IExtendedProcess;
import com.ximai.mes.constant.WorkorderStatusEnum;
import com.ximai.mes.pro.domain.proWorkOrder.ProWorkorder;
import com.ximai.mes.remote.ErpService;
import com.ximai.mes.remote.dto.ProWorkorderStateUpdate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class WorkorderStateUpdateProcess implements IExtendedProcess {
@Autowired
ErpService erpService;
@Override
public void process(Object[] args, Object returnResult) {
ProWorkorder workorder = (ProWorkorder)args[0];
WorkorderStatusEnum workorderStatusEnum = (WorkorderStatusEnum)args[1];
ProWorkorderStateUpdate stateUpdate = new ProWorkorderStateUpdate();
stateUpdate.setWorkorderCode(workorder.getWorkorderCode());
stateUpdate.setWorkorderType(workorder.getWorkorderType());
if(workorderStatusEnum==WorkorderStatusEnum.FINISHED){
stateUpdate.setState("y");
erpService.updateWorkorderState(stateUpdate);
}else if(workorderStatusEnum==WorkorderStatusEnum.PRODUCING){
stateUpdate.setState("3");
erpService.updateWorkorderState(stateUpdate);
}
}
}
...@@ -49,7 +49,8 @@ ...@@ -49,7 +49,8 @@
ptw.status, ptw.status,
ptw.create_by, ptw.create_by,
ptw.create_time, ptw.create_time,
ptw.remark ptw.remark,
ptw.outsourced
from pro_task_workunit ptw from pro_task_workunit ptw
left join md_workunit mw left join md_workunit mw
on mw.workunit_id = ptw.workunit_id on mw.workunit_id = ptw.workunit_id
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment