diff --git a/ant-design-vue-jeecg/src/views/system/DictList.vue b/ant-design-vue-jeecg/src/views/system/DictList.vue index 65cb5d0..b8572f1 100644 --- a/ant-design-vue-jeecg/src/views/system/DictList.vue +++ b/ant-design-vue-jeecg/src/views/system/DictList.vue @@ -7,7 +7,7 @@ <a-row :gutter="12"> <a-col :md="7" :sm="8"> <a-form-item label="字典名称" :labelCol="{span: 6}" :wrapperCol="{span: 14, offset: 1}"> - <a-input placeholder="请输入字典名称" v-model="queryParam.dictName"></a-input> + <j-input placeholder="请输入字典名称" v-model="queryParam.dictName"></j-input> </a-form-item> </a-col> <a-col :md="7" :sm="8"> diff --git a/ant-design-vue-jeecg/src/views/system/monitor/OperationLog.vue b/ant-design-vue-jeecg/src/views/system/monitor/OperationLog.vue index 73e81df..48e040f 100644 --- a/ant-design-vue-jeecg/src/views/system/monitor/OperationLog.vue +++ b/ant-design-vue-jeecg/src/views/system/monitor/OperationLog.vue @@ -11,18 +11,30 @@ </a-col> <a-col :xl="6" :lg="7" :md="8" :sm="24"> <a-form-item label="业务类型"> - <a-input placeholder="请输入业务类型" v-model="queryParam.bizType"></a-input> + <j-dict-select-tag placeholder="请选择业务类型" v-model="queryParam.bizType" dictCode="operation_log_type"/> </a-form-item> </a-col> <a-col :xl="6" :lg="7" :md="8" :sm="24"> + <a-form-item label="业务标签"> + <j-multi-select-tag placeholder="请选择业务标签" v-model="queryParam.bizTag" dictCode="operation_log_tag"/> + </a-form-item> + </a-col> + <template v-if="toggleSearchStatus"> + <a-col :xl="6" :lg="7" :md="8" :sm="24"> <a-form-item label="操作内容"> <j-input placeholder="请输入操作内容" v-model="queryParam.operationMsg"></j-input> </a-form-item> </a-col> + </template> <a-col :xl="6" :lg="7" :md="8" :sm="24"> <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons"> <a-button type="primary" @click="searchQuery" icon="search">查询</a-button> + <a-button type="primary" @click="handleExportXls('操作记录')" icon="download" style="margin-left: 8px">导出</a-button> <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button> + <a @click="handleToggleSearch" style="margin-left: 8px"> + {{ toggleSearchStatus ? '收起' : '展开' }} + <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/> + </a> </span> </a-col> </a-row> @@ -30,14 +42,6 @@ </div> <!-- 查询区域-END --> - <!-- 操作按钮区域 --> - <div class="table-operator"> - <a-button type="primary" icon="download" @click="handleExportXls('操作记录表')">导出</a-button> - <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel"> - <a-button type="primary" icon="import">导入</a-button> - </a-upload> - </div> - <!-- table区域-begin --> <div> <a-table @@ -113,6 +117,11 @@ dataIndex: 'bizType' }, { + title:'业务标签', + align:"center", + dataIndex: 'bizTag' + }, + { title:'操作内容', align:"center", dataIndex: 'operationMsg' @@ -133,21 +142,6 @@ dataIndex: 'operationCostTime' }, { - title:'方法返回内容', - align:"center", - dataIndex: 'contentReturn' - }, - { - title:'方法异常内容', - align:"center", - dataIndex: 'contentException' - }, - { - title:'操作人ID', - align:"center", - dataIndex: 'operatorId' - }, - { title:'操作人姓名', align:"center", dataIndex: 'operatorName' @@ -207,7 +201,6 @@ fieldList.push({type:'int',value:'operationCostTime',text:'操作耗时',dictCode:''}) fieldList.push({type:'string',value:'contentReturn',text:'方法返回内容',dictCode:''}) fieldList.push({type:'string',value:'contentException',text:'方法异常内容',dictCode:''}) - fieldList.push({type:'string',value:'operatorId',text:'操作人ID',dictCode:''}) fieldList.push({type:'string',value:'operatorName',text:'操作人姓名',dictCode:''}) this.superFieldList = fieldList } diff --git a/ant-design-vue-jeecg/src/views/system/monitor/modules/OperationLogForm.vue b/ant-design-vue-jeecg/src/views/system/monitor/modules/OperationLogForm.vue index 9f4fabc..4fc51e3 100644 --- a/ant-design-vue-jeecg/src/views/system/monitor/modules/OperationLogForm.vue +++ b/ant-design-vue-jeecg/src/views/system/monitor/modules/OperationLogForm.vue @@ -14,6 +14,11 @@ </a-form-model-item> </a-col> <a-col :span="24"> + <a-form-model-item label="业务标签" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="bizTag"> + <a-input v-model="model.bizTag" placeholder="请输入业务标签" ></a-input> + </a-form-model-item> + </a-col> + <a-col :span="24"> <a-form-model-item label="操作内容" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="operationMsg"> <a-input v-model="model.operationMsg" placeholder="请输入操作内容" ></a-input> </a-form-model-item> @@ -44,11 +49,6 @@ </a-form-model-item> </a-col> <a-col :span="24"> - <a-form-model-item label="操作人ID" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="operatorId"> - <a-input v-model="model.operatorId" placeholder="请输入操作人ID" ></a-input> - </a-form-model-item> - </a-col> - <a-col :span="24"> <a-form-model-item label="操作人姓名" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="operatorName"> <a-input v-model="model.operatorName" placeholder="请输入操作人姓名" ></a-input> </a-form-model-item> diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/cas/controller/CasClientController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/cas/controller/CasClientController.java index 1f2bdbb..6323d0d 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/cas/controller/CasClientController.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/cas/controller/CasClientController.java @@ -6,6 +6,8 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import cn.hutool.crypto.SecureUtil; +import cn.monitor4all.logRecord.annotation.OperationLog; + import org.apache.commons.lang.StringUtils; import org.jeecg.common.api.vo.Result; import org.jeecg.common.constant.CacheConstant; @@ -71,7 +73,7 @@ public class CasClientController { if (StringUtils.isEmpty(principal)) { throw new Exception("No principal was found in the response from the CAS server."); } - log.info("-------token----username---" + principal); + log.info("---token---username---" + principal); // 1. 校验用户是否有效 SysUser sysUser = sysUserService.getUserByName(principal); result = sysUserService.checkUserIsEffective(sysUser); diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/acs/controller/AcsController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/acs/controller/AcsController.java index a02b72c..c0d88b2 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/acs/controller/AcsController.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/acs/controller/AcsController.java @@ -9,24 +9,21 @@ import org.jeecg.common.api.vo.Result; import org.jeecg.modules.wms.api.acs.entity.AcsStatus; import org.jeecg.modules.wms.api.acs.service.IAcsService; import org.jeecg.modules.wms.config.address.service.IAddressService; -import org.jeecg.modules.wms.framework.aspectj.dto.ApiAuthentication; -import org.jeecg.modules.wms.framework.aspectj.dto.ApiAuthentication.ApiAuthenticationBuild; import org.jeecg.modules.wms.framework.aspectj.lang.annotation.ApiLogger; import org.jeecg.modules.wms.framework.controller.HuahengBaseController; import org.jeecg.modules.wms.task.agvTask.service.IAgvTaskService; -import org.jeecg.utils.OkHttpUtils; +import org.jeecg.utils.HuahengJwtUtil; import org.jeecg.utils.StringUtils; import org.jeecg.utils.constant.QuantityConstant; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; -import com.alibaba.fastjson.JSON; - +import cn.monitor4all.logRecord.annotation.OperationLog; +import cn.monitor4all.logRecord.context.LogRecordContext; import io.swagger.annotations.ApiOperation; @RestController @@ -46,12 +43,15 @@ public class AcsController extends HuahengBaseController { // @ApiLogger(apiName = "API接口第三方Token校验测试", from = "TEST") @ResponseBody @PostMapping(value = "/testTokenCheck") + @OperationLog(bizType = "'物料追踪'", tag = "'入库完成'", bizId = "#paramMap.get('bizId')",extra = "#jsonString", msg = "'测试操作日志'", + operatorId = "#username", recordReturnValue = true) public Result<?> testTokenCheck(@RequestBody Map<String, String> paramMap, HttpServletRequest request) { - String audience = ApiAuthentication.getInstance().getAudience(); - String url = "http://127.0.0.1:8080/wms/api/wms/acs/testTokenCheck"; - String body = OkHttpUtils.sendPostByJsonStr(url, JSON.toJSONString(paramMap)); +// String audience = ApiAuthentication.getInstance().getAudience(); +// String url = "http://localhost:8080/wms/api/wms/acs/testTokenCheck"; +// String body = OkHttpUtils.sendPostByJsonStr(url, JSON.toJSONString(paramMap)); // String url = addressService.getUrlByParam(QuantityConstant.ADDRESS_AGV_TASK_ASSIGN); - return Result.ok(body); + LogRecordContext.putVariable("username", HuahengJwtUtil.getCurrentOperator()); + return Result.ok(); } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/aspectj/dto/ApiAuthentication.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/aspectj/dto/ApiAuthentication.java index 9b007f0..5aa6397 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/aspectj/dto/ApiAuthentication.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/aspectj/dto/ApiAuthentication.java @@ -22,7 +22,7 @@ public class ApiAuthentication { private String operator; /** Token使用方 */ - private String audience; // 观众,相当于接受者 + private String audience = "Unknown"; // 观众,相当于接受者 /** Token签发方(WMS) */ private String issuer = HuahengJwtUtil.HUAHENG_SYSTEM_ID; diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/controller/TestController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/controller/TestController.java index 945c84e..47240b7 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/controller/TestController.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/framework/controller/TestController.java @@ -2,29 +2,27 @@ package org.jeecg.modules.wms.framework.controller; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; -import java.util.Date; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import javax.servlet.http.HttpServletRequest; import org.jeecg.common.api.vo.Result; -import org.jeecg.common.aspect.annotation.AutoLog; -import org.jeecg.modules.system.entity.SysDataLog; import org.jeecg.modules.system.service.ISysDataLogService; -import org.jeecg.modules.wms.framework.aspectj.lang.annotation.ApiLogger; +import org.jeecg.modules.wms.receipt.receiptHeader.entity.ReceiptHeader; +import org.jeecg.utils.HuahengJwtUtil; import org.jeecg.utils.HuahengRedisUtil; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import com.alibaba.fastjson.JSON; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.alibaba.fastjson.TypeReference; +import cn.monitor4all.logRecord.annotation.OperationLog; +import cn.monitor4all.logRecord.context.LogRecordContext; import lombok.extern.slf4j.Slf4j; /** @@ -41,8 +39,7 @@ public class TestController extends HuahengBaseController { @Autowired private ISysDataLogService sysDataLogService; - - + // @ApiLogger(apiName = "API接口第三方Token校验测试", from = "TEST") // @ResponseBody // @PostMapping(value = "/api/wms/testTokenCheck") @@ -51,42 +48,54 @@ public class TestController extends HuahengBaseController { // // return new Result<>(); // } - - @AutoLog(value = "TestController-testRedis") +// @AutoLog(value = "TestController-testRedis") @ResponseBody @PostMapping(value = "/test/testRedis") - public Result<?> testRedis(@RequestBody Map<String, String> paramMap, HttpServletRequest request) { - -// log.info("testRedis in paramMap:{}", JSON.toJSONString(paramMap)); -// String key = "testKey"; -// Map<String, ReceiptHeader> receiptHeaderMap = new ConcurrentHashMap<String, ReceiptHeader>(); -// ReceiptHeader receiptHeader = new ReceiptHeader(); -// receiptHeader.setCode("001"); -// receiptHeaderMap.put("receiptHeaderKey", receiptHeader); -// Map<String, ReceiptHeader> value = redisUtil.getAndSet(key, receiptHeaderMap, new TypeReference<Map<String, ReceiptHeader>>() {}, 10); -// Long rxpireTime = redisUtil.getExpire(key); -// log.info("redisUtil.getAndSet {} -> {} rxpireTime -> {}", key, JSON.toJSONString(value), rxpireTime); -// -// Thread.sleep(2000l); + @OperationLog(bizType = "'物料追踪'", tag = "'分配库位'", bizId = "#paramMap.get('bizId')",extra = "#jsonString", msg = "'测试操作日志'", + operatorId = "#username", recordReturnValue = true) + public Result<?> testRedis(@RequestBody Map<String, String> paramMap, HttpServletRequest request) throws InterruptedException { + Result result = new Result<>(); + String testString = "我是testString1"; + LogRecordContext.putVariable("testString1", testString); + testString = "我是testString2"; + LogRecordContext.putVariable("testString2", testString); + result.setMessage(testString); + log.info("testRedis in paramMap:{}", JSON.toJSONString(paramMap)); + String key = "testKey"; + Map<String, ReceiptHeader> receiptHeaderMap = new ConcurrentHashMap<String, ReceiptHeader>(); + ReceiptHeader receiptHeader = new ReceiptHeader(); + receiptHeader.setCode(paramMap.get("bizId")); + receiptHeaderMap.put("receiptHeaderKey", receiptHeader); + LogRecordContext.putVariable("jsonString", JSON.toJSONString(receiptHeaderMap)); + Map<String, ReceiptHeader> value = redisUtil.getAndSet(key, receiptHeaderMap, new TypeReference<Map<String, ReceiptHeader>>() {}, 10); + Long rxpireTime = redisUtil.getExpire(key); + log.info("redisUtil.getAndSet {} -> {} rxpireTime -> {}", key, JSON.toJSONString(value), rxpireTime); + LogRecordContext.putVariable("username", HuahengJwtUtil.getCurrentOperator()); +// result.setSuccess(false); +// LogRecordContext.putVariable("isSuccess", result.isSuccess()); + + Thread.sleep(2000l); +// throw new RuntimeException("自定义失败"); + return result; // receiptHeaderMap = redisUtil.get(key, new TypeReference<Map<String, ReceiptHeader>>() {}); // rxpireTime = redisUtil.getExpire(key); // log.info("redisUtil.get {} sleep 2s -> {} rxpireTime -> {}", key, JSON.toJSONString(value), rxpireTime); - Result result = handleMultiProcess("testRedis", paramMap.get("username"), new MultiProcessListener() { - - @Override - @Transactional(timeout = 10) - public Result<?> doProcess() throws Exception { - LambdaUpdateWrapper<SysDataLog> updateWrapper = new UpdateWrapper().lambda(); - updateWrapper.set(SysDataLog::getUpdateTime, new Date()); - updateWrapper.eq(SysDataLog::getId, 10); - Thread.sleep(1000); - sysDataLogService.update(updateWrapper); - return new Result<>(); - } - - }); +// Result result = handleMultiProcess("testRedis", paramMap.get("username"), new MultiProcessListener() { +// +// @Override +// @Transactional(timeout = 10) +// public Result<?> doProcess() throws Exception { +// LambdaUpdateWrapper<SysDataLog> updateWrapper = new UpdateWrapper().lambda(); +// updateWrapper.set(SysDataLog::getUpdateTime, new Date()); +// updateWrapper.eq(SysDataLog::getId, 10); +// Thread.sleep(1000); +// sysDataLogService.update(updateWrapper); +// return new Result<>(); +// } +// +// }); // Long count = redisUtil.decr("countKey", 10); // rxpireTime = redisUtil.getExpire("countKey"); @@ -119,8 +128,8 @@ public class TestController extends HuahengBaseController { // rxpireTime = redisUtil.getExpire("countKey"); // log.info("countKey sleep 10s get -> {} rxpireTime -> {}", count, rxpireTime); // log.info("countKey hasKey -> {}",redisUtil.hasKey("countKey")); - - return result; +// LogRecordContext.putVariable("result", result); +// return result; } private int generateInt(int min, int max) throws NoSuchAlgorithmException { diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/operation/controller/OperationLogController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/operation/controller/OperationLogController.java index 246fa50..6b57557 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/operation/controller/OperationLogController.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/operation/controller/OperationLogController.java @@ -58,6 +58,7 @@ public class OperationLogController extends JeecgController<OperationLog, IOpera public Result<IPage<OperationLog>> queryPageList(OperationLog operationLog, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest req) { QueryWrapper<OperationLog> queryWrapper = QueryGenerator.initQueryWrapper(operationLog, req.getParameterMap()); + queryWrapper.orderByAsc("operation_time"); Page<OperationLog> page = new Page<OperationLog>(pageNo, pageSize); IPage<OperationLog> pageList = operationLogService.page(page, queryWrapper); return Result.OK(pageList); diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/operation/entity/OperationLog.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/operation/entity/OperationLog.java index 4830014..5f24fd3 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/operation/entity/OperationLog.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/operation/entity/OperationLog.java @@ -43,6 +43,10 @@ public class OperationLog implements Serializable { @Excel(name = "业务类型", width = 15) @ApiModelProperty(value = "业务类型") private java.lang.String bizType; + /**业务标签*/ + @Excel(name = "业务标签", width = 15) + @ApiModelProperty(value = "业务标签") + private java.lang.String bizTag; /**操作内容*/ @Excel(name = "操作内容", width = 15) @ApiModelProperty(value = "操作内容") @@ -67,10 +71,6 @@ public class OperationLog implements Serializable { @Excel(name = "方法异常内容", width = 15) @ApiModelProperty(value = "方法异常内容") private java.lang.String contentException; - /**操作人ID*/ - @Excel(name = "操作人ID", width = 15) - @ApiModelProperty(value = "操作人ID") - private java.lang.String operatorId; /**操作人姓名*/ @Excel(name = "操作人姓名", width = 15) @ApiModelProperty(value = "操作人姓名") diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/operation/service/impl/OperationLogServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/operation/service/impl/OperationLogServiceImpl.java index 49e9753..829c965 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/operation/service/impl/OperationLogServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/operation/service/impl/OperationLogServiceImpl.java @@ -1,13 +1,20 @@ package org.jeecg.modules.wms.monitor.operation.service.impl; +import java.util.ArrayList; +import java.util.List; + import org.jeecg.modules.wms.monitor.operation.entity.OperationLog; import org.jeecg.modules.wms.monitor.operation.mapper.OperationLogMapper; import org.jeecg.modules.wms.monitor.operation.service.IOperationLogService; +import org.jeecg.modules.wms.receipt.receiptContainerHeader.entity.ReceiptContainerDetail; +import org.jeecg.utils.StringUtils; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import cn.hutool.core.util.StrUtil; import cn.monitor4all.logRecord.bean.LogDTO; import cn.monitor4all.logRecord.service.IOperationLogGetService; import lombok.extern.slf4j.Slf4j; @@ -25,26 +32,54 @@ public class OperationLogServiceImpl extends ServiceImpl<OperationLogMapper, Ope @Override public boolean createLog(LogDTO logDTO) throws Exception { try { - log.debug(">>>>>> create OperationLog: [{}]", JSON.toJSONString(logDTO)); - if (null == logDTO.getBizId()) { - log.error(">>>>>> create OperationLog bizId is null"); - return false; + log.debug(">>>>>> create OperationLog:{} <<<<<<", JSON.toJSONString(logDTO)); + List<OperationLog> operationLogList = new ArrayList<OperationLog>(); + if (!StringUtils.isEmpty(logDTO.getExtra())) { + if (logDTO.getBizType().equals("物料追踪") && logDTO.getTag().equals("入库组盘")) { + List<ReceiptContainerDetail> receiptContainerDetailList = JSON.parseArray(logDTO.getExtra(), ReceiptContainerDetail.class); + if (CollectionUtils.isEmpty(receiptContainerDetailList)) { + return true; + } + for (ReceiptContainerDetail receiptContainerDetail : receiptContainerDetailList) { + if (receiptContainerDetail == null || receiptContainerDetail.getUniqueCode() == null) { + continue; + } + String msg = StrUtil.format("上游单号:{},入库单据号:{},仓库编码:{},托盘编码:{},物料编码:{},入库数量:{}", receiptContainerDetail.getReferCode(), + receiptContainerDetail.getReceiptCode(), receiptContainerDetail.getWarehouseCode(), receiptContainerDetail.getContainerCode(), + receiptContainerDetail.getMaterialCode(), receiptContainerDetail.getQty()); + OperationLog operationLog = new OperationLog(); + operationLog.setBizId(receiptContainerDetail.getUniqueCode()); + operationLog.setBizType(logDTO.getBizType()); + operationLog.setBizTag(logDTO.getTag()); + operationLog.setContentException(StringUtils.substring(logDTO.getException(), 0, 1000)); + operationLog.setContentReturn(StringUtils.substring(logDTO.getReturnStr(), 0, 1000)); + operationLog.setOperationCostTime(logDTO.getExecutionTime()); + operationLog.setOperationMsg(StringUtils.substring(msg, 0, 1000)); + operationLog.setOperationStatus(logDTO.getSuccess().equals(true) ? 1 : 0); + operationLog.setOperationTime(logDTO.getOperateDate()); + operationLog.setOperatorName(logDTO.getOperatorId()); + operationLogList.add(operationLog); + } + } + } + if (!StringUtils.isEmpty(logDTO.getBizId())) { + OperationLog operationLog = new OperationLog(); + operationLog.setBizId(logDTO.getBizId()); + operationLog.setBizType(logDTO.getBizType()); + operationLog.setBizTag(logDTO.getTag()); + operationLog.setContentException(StringUtils.substring(logDTO.getException(), 0, 1000)); + operationLog.setContentReturn(StringUtils.substring(logDTO.getReturnStr(), 0, 1000)); + operationLog.setOperationCostTime(logDTO.getExecutionTime()); + operationLog.setOperationMsg(StringUtils.substring(logDTO.getMsg(), 0, 1000)); + operationLog.setOperationStatus(logDTO.getSuccess().equals(true) ? 1 : 0); + operationLog.setOperationTime(logDTO.getOperateDate()); + operationLog.setOperatorName(logDTO.getOperatorId()); + operationLogList.add(operationLog); } - OperationLog operationLog = new OperationLog(); - operationLog.setBizId(logDTO.getBizId()); - operationLog.setBizType(logDTO.getBizType()); - operationLog.setContentException(logDTO.getException()); - operationLog.setContentReturn(logDTO.getReturnStr()); - operationLog.setOperationCostTime(logDTO.getExecutionTime()); - operationLog.setOperationMsg(logDTO.getMsg()); - operationLog.setOperationStatus(logDTO.getSuccess().equals(true) ? 1 : 0); - operationLog.setOperationTime(logDTO.getOperateDate()); - operationLog.setOperatorId(logDTO.getOperatorId()); - operationLog.setOperatorName(logDTO.getOperatorId()); - this.save(operationLog); + this.saveBatch(operationLogList); return true; } catch (Exception e) { - log.error(">>>>>> create OperationLog error:{}", e.getMessage(), e); + log.error(">>>>>> create OperationLog error:{} <<<<<<", e.getMessage(), e); return false; } } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/entity/ReceiptContainerDetail.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/entity/ReceiptContainerDetail.java index 51696a2..67aecf9 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/entity/ReceiptContainerDetail.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/entity/ReceiptContainerDetail.java @@ -39,6 +39,10 @@ public class ReceiptContainerDetail implements Serializable { /** 入库单详情ID */ @ApiModelProperty(value = "入库单详情ID") private Integer receiptDetailId; + /** 容器号 */ + @Excel(name = "容器号", width = 15) + @ApiModelProperty(value = "容器号") + private String containerCode; /** 入库单编码 */ @ApiModelProperty(value = "入库单编码") private String receiptCode; @@ -50,6 +54,10 @@ public class ReceiptContainerDetail implements Serializable { @Excel(name = "货主编码", width = 15) @ApiModelProperty(value = "货主编码") private String companyCode; + /** 上游单号 */ + @Excel(name = "上游单号", width = 15) + @ApiModelProperty(value = "上游单号") + private String referCode; /** 物料编码 */ @Excel(name = "物料编码", width = 15) @ApiModelProperty(value = "物料编码") diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/controller/ReceiptHeaderController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/controller/ReceiptHeaderController.java index 7ebebac..d30c139 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/controller/ReceiptHeaderController.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/controller/ReceiptHeaderController.java @@ -1,6 +1,8 @@ package org.jeecg.modules.wms.receipt.receiptHeader.controller; import com.aliyun.oss.ServiceException; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.jeecg.common.system.query.QueryGenerator; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -195,6 +197,25 @@ public class ReceiptHeaderController extends JeecgController<ReceiptHeader, IRec return Result.OK(pageList); } + @ApiOperation(value = "入库单详情-通过多个明细id查询", notes = "入库单详情-通过多个明细id查询") + @PostMapping(value = "/listReceiptDetailByIds") + public Result<List<ReceiptDetail>> listReceiptDetailByIds(@RequestBody List<Integer> ids ) { + return Result.ok(receiptDetailService.listByIds(ids)); + } + + @ApiOperation(value = "入库单详情-查询未收完的明细", notes = "入库单详情-查询未收完的明细") + @GetMapping(value = "/listReceiptDetailByCode") + public Result<IPage<ReceiptDetail>> listReceiptDetailByCode(String code, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { + LambdaQueryWrapper<ReceiptDetail> query = Wrappers.lambdaQuery(); + query.eq(StringUtils.isNotEmpty(code), ReceiptDetail::getReceiptCode, code) + .lt(ReceiptDetail::getStatus, QuantityConstant.RECEIPT_HEADER_COMPLETED) + .last(" and qty-task_qty>0"); + Page<ReceiptDetail> page = new Page<ReceiptDetail>(pageNo, pageSize); + IPage<ReceiptDetail> pageList = receiptDetailService.page(page, query); + return Result.ok(pageList); + } + /** * 添加 * @param receiptDetail @@ -287,7 +308,7 @@ public class ReceiptHeaderController extends JeecgController<ReceiptHeader, IRec String selections = request.getParameter("selections"); if (oConvertUtils.isNotEmpty(selections)) { List<String> selectionList = Arrays.asList(selections.split(",")); - exportList = pageList.stream().filter(item -> selectionList.contains(item.getId())).collect(Collectors.toList()); + exportList = pageList.stream().filter(item -> selectionList.contains(item.getId().toString())).collect(Collectors.toList()); } else { exportList = pageList; } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/domain/Receive.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/domain/Receive.java index 9265923..3a11474 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/domain/Receive.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/domain/Receive.java @@ -7,8 +7,9 @@ import java.math.BigDecimal; @Data public class Receive { - private Integer id; - private String containerCode; + private Integer id;// 入库详情ID + private String containerCode; // 托盘号 + private String uniqueCode;// 唯一号 private String materialCode; private String materialName; private String mateiralSpec; diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/service/impl/ReceiveServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/service/impl/ReceiveServiceImpl.java index 8b3718a..4ebb68d 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/service/impl/ReceiveServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiving/service/impl/ReceiveServiceImpl.java @@ -1,9 +1,14 @@ package org.jeecg.modules.wms.receipt.receiving.service.impl; +import com.alibaba.fastjson.JSON; import com.aliyun.oss.ServiceException; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import cn.monitor4all.logRecord.annotation.OperationLog; +import cn.monitor4all.logRecord.context.LogRecordContext; + import org.jeecg.common.api.vo.Result; import org.jeecg.modules.wms.config.container.entity.Container; import org.jeecg.modules.wms.config.container.service.IContainerService; @@ -23,6 +28,7 @@ import org.jeecg.modules.wms.receipt.receiving.domain.Receive; import org.jeecg.modules.wms.receipt.receiving.mapper.ReceiveMapper; import org.jeecg.modules.wms.receipt.receiving.service.IReceiveService; import org.jeecg.modules.wms.task.taskHeader.entity.TaskHeader; +import org.jeecg.utils.HuahengJwtUtil; import org.jeecg.utils.StringUtils; import org.jeecg.utils.constant.QuantityConstant; import org.springframework.stereotype.Service; @@ -82,6 +88,8 @@ public class ReceiveServiceImpl extends ServiceImpl<ReceiveMapper, Receive> impl */ @Override @Transactional(rollbackFor = ServiceException.class) + @OperationLog(bizId = "''", bizType = "'物料追踪'", tag = "'入库组盘'", extra = "#extraJsonString", msg = "''", + operatorId = "#username", recordReturnValue = true) public Result<ReceiptContainerHeader> receiving(List<Receive> receiveList, String warehouseCode) { boolean result = false; if (receiveList == null || receiveList.size() == 0) { @@ -144,12 +152,15 @@ public class ReceiveServiceImpl extends ServiceImpl<ReceiveMapper, Receive> impl List<ReceiptDetail> receiptDetailList = new ArrayList<>(); List<ReceiptContainerDetail> receiptContainerDetailList = new ArrayList<>(); for (Receive receive : receiveList) { - // 待收数量 + // 可收数量 BigDecimal qty = receive.getQty(); // 收货数量 BigDecimal taskQty = receive.getTaskQty(); + if (qty == null || taskQty == null) { + throw new ServiceException("收货数量或可收数量为空"); + } if (taskQty.compareTo(qty) > 0) { - throw new ServiceException("收货数量不能可收数量,收货数量:" + taskQty + " 可收数量:" + qty); + throw new ServiceException("收货数量不能大于可收数量,收货数量:" + taskQty + "可收数量:" + qty); } if (taskQty.compareTo(BigDecimal.ZERO) <= 0) { continue; @@ -194,6 +205,9 @@ public class ReceiveServiceImpl extends ServiceImpl<ReceiveMapper, Receive> impl } else { receiptContainerDetail = new ReceiptContainerDetail(); receiptContainerDetail.setCompanyCode(receiptDetail.getCompanyCode()); + receiptContainerDetail.setReferCode(receiptDetail.getReferCode()); + receiptContainerDetail.setUniqueCode(receive.getUniqueCode()); + receiptContainerDetail.setContainerCode(receive.getContainerCode()); receiptContainerDetail.setReceiptDetailId(receiptDetail.getId()); receiptContainerDetail.setReceiptId(receiptDetail.getReceiptId()); receiptContainerDetail.setReceiptCode(receiptDetail.getReceiptCode()); @@ -210,8 +224,8 @@ public class ReceiveServiceImpl extends ServiceImpl<ReceiveMapper, Receive> impl receiptContainerDetail.setInventoryStatus(receiptDetail.getInventoryStatus()); receiptContainerDetailList.add(receiptContainerDetail); } - } + result = receiptDetailService.updateBatchById(receiptDetailList); if (!result) { throw new ServiceException("批量更新入库单详情失败"); @@ -223,7 +237,8 @@ public class ReceiveServiceImpl extends ServiceImpl<ReceiveMapper, Receive> impl throw new ServiceException("保存入库组盘详情失败"); } } - + LogRecordContext.putVariable("username", HuahengJwtUtil.getCurrentOperator()); + LogRecordContext.putVariable("extraJsonString", JSON.toJSONString(receiptContainerDetailList)); return Result.OK("收货成功", receiptContainerHeader); } } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/utils/HuahengJwtUtil.java b/huaheng-wms-core/src/main/java/org/jeecg/utils/HuahengJwtUtil.java index d16825f..59bcf98 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/utils/HuahengJwtUtil.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/utils/HuahengJwtUtil.java @@ -6,7 +6,9 @@ import java.util.UUID; import javax.servlet.http.HttpServletRequest; +import org.apache.shiro.SecurityUtils; import org.jeecg.common.exception.JeecgBootException; +import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.oConvertUtils; import org.jeecg.modules.wms.framework.aspectj.dto.ApiAuthentication; import org.jeecg.modules.wms.framework.aspectj.dto.RSA256Key; @@ -141,6 +143,20 @@ public class HuahengJwtUtil { } /** + * 获取当前操作人 + * @author TanYibin + * @createDate 2023年2月22日 + * @return + */ + public static String getCurrentOperator() { + LoginUser loginUser = SecurityUtils.getSubject().getPrincipal() != null ? (LoginUser)SecurityUtils.getSubject().getPrincipal() : null; + if (loginUser != null) { + return loginUser.getRealname(); + } + return ApiAuthentication.getInstance().getAudience(); + } + + /** * 获得token中的信息无需secret解密也能获得 * @return token中包含的用户名 */ diff --git a/huaheng-wms-core/src/main/java/org/jeecg/utils/interceptor/HuahengBatisInterceptor.java b/huaheng-wms-core/src/main/java/org/jeecg/utils/interceptor/HuahengBatisInterceptor.java index b63efdf..282297e 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/utils/interceptor/HuahengBatisInterceptor.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/utils/interceptor/HuahengBatisInterceptor.java @@ -24,7 +24,7 @@ public class HuahengBatisInterceptor implements Interceptor { @Override public Object intercept(Invocation invocation) throws Throwable { MappedStatement mappedStatement = (MappedStatement)invocation.getArgs()[0]; - String sqlId = mappedStatement.getId(); +// String sqlId = mappedStatement.getId(); // log.debug("------sqlId------" + sqlId); SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType(); Object parameter = invocation.getArgs()[1];