模块:实现日志阅读状态检查与分页查询优化

- 在工作日志模块中,新增日志阅读状态检查功能,以防止修改已阅读的日志。
- 优化工作日志的分页查询逻辑,使用PageParam实现灵活的分页逻辑。
- 调整相关Service接口和实现类,添加日志阅读状态的检查方法。
- 修复Excel导出中关于数据验证样式的问题。

智能工厂模块:增加工厂数据平方数计算与规格转换

- 为智能工厂模块添加工厂数据的平方数计算功能,支持根据规格名称进行转换。
- 引入规格数据校验逻辑,确保数据的一致性和准确性。
-调整数据库模型和Mapper,以支持新的平方数字段和计算逻辑。
- 优化数据导入导出功能,提升用户体验和数据处理效率。
This commit is contained in:
furongxin 2024-09-09 19:08:53 +08:00
parent b5edcd0197
commit 47b730c072
28 changed files with 341 additions and 366 deletions

View File

@ -84,6 +84,7 @@ public class SpinnerWriteHandler implements SheetWriteHandler {
/*** 处理Excel兼容性问题 **/ /*** 处理Excel兼容性问题 **/
if (dataValidation instanceof XSSFDataValidation) { if (dataValidation instanceof XSSFDataValidation) {
dataValidation.setSuppressDropDownArrow(true); //验证输入数据是否真确 dataValidation.setSuppressDropDownArrow(true); //验证输入数据是否真确
dataValidation.setErrorStyle(DataValidation.ErrorStyle.STOP);
dataValidation.setShowErrorBox(true); dataValidation.setShowErrorBox(true);
dataValidation.setShowPromptBox(true); dataValidation.setShowPromptBox(true);
} else { } else {

View File

@ -220,6 +220,8 @@ public interface ErrorCodeConstants {
ErrorCode LOG_NOT_UPDATE = new ErrorCode(1_009_010_008, "已过了提交时间,不能修改"); ErrorCode LOG_NOT_UPDATE = new ErrorCode(1_009_010_008, "已过了提交时间,不能修改");
ErrorCode LOG_HAS_READ = new ErrorCode(1_009_010_009, "日志已被阅读,不能修改");
ErrorCode BANK_NOT_EXISTS = new ErrorCode(1_009_020_001, "银行卡信息不存在"); ErrorCode BANK_NOT_EXISTS = new ErrorCode(1_009_020_001, "银行卡信息不存在");
ErrorCode BANK_EXISTS = new ErrorCode(1_009_020_003, "银行卡号已存在"); ErrorCode BANK_EXISTS = new ErrorCode(1_009_020_003, "银行卡号已存在");

View File

@ -1,5 +1,7 @@
package cn.iocoder.yudao.module.system.dal.mysql.worklog; package cn.iocoder.yudao.module.system.dal.mysql.worklog;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission; import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
@ -23,9 +25,9 @@ import java.util.List;
public interface LogInstanceMapper extends BaseMapperX<LogInstanceDO> { public interface LogInstanceMapper extends BaseMapperX<LogInstanceDO> {
default List<LogInstanceDO> getUpLog(Long userId, Long formId) { default PageResult<LogInstanceDO> getUpLog(Long userId, Long formId) {
return selectList(new LambdaQueryWrapperX<LogInstanceDO>() return selectPage(new PageParam().setPageNo(1).setPageSize(1), new LambdaQueryWrapperX<LogInstanceDO>()
.eq(LogInstanceDO::getStartUserId, userId) .eq(LogInstanceDO::getStartUserId, userId)
.eqIfPresent(LogInstanceDO::getFormId, formId) .eqIfPresent(LogInstanceDO::getFormId, formId)
.orderByDesc(LogInstanceDO::getCreateTime)); .orderByDesc(LogInstanceDO::getCreateTime));

View File

@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.system.service.worklog;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.date.DateUtils; import cn.iocoder.yudao.framework.common.util.date.DateUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptRespVO; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptRespVO;
@ -178,23 +179,28 @@ public class LogInstanceServiceImpl implements LogInstanceService {
// 校验存在 // 校验存在
validateLogInstanceExists(updateReqVO.getId()); validateLogInstanceExists(updateReqVO.getId());
//校验要修改的日志是否是当天发送的 // 校验日志是否已被查看
if (logReadService.isReadByLogId(updateReqVO.getId())) {
throw exception(LOG_HAS_READ);
}
// 校验要修改的日志是否是当天发送的
LogInstanceDO logInstanceDO = logInstanceMapper.selectById(updateReqVO.getId()); LogInstanceDO logInstanceDO = logInstanceMapper.selectById(updateReqVO.getId());
if (!logInstanceDO.getCreateTime().toLocalDate().equals(LocalDate.now())) { if (!logInstanceDO.getCreateTime().toLocalDate().equals(LocalDate.now())) {
throw exception(LOG_NOT_DATE); throw exception(LOG_NOT_DATE);
} }
LogRuleDO logRuleDO = logRuleService.getLogRuleByFormId(updateReqVO.getFormId()); // LogRuleDO logRuleDO = logRuleService.getLogRuleByFormId(updateReqVO.getFormId());
String endTime = logRuleDO.getEndTime(); // String endTime = logRuleDO.getEndTime();
if (logRuleDO.getType() != 1) { // if (logRuleDO.getType() != 1) {
//
endTime = endTime.split(",")[1]; // endTime = endTime.split(",")[1];
} // }
//
if (LocalTime.now().isAfter(LocalTime.parse(endTime))) { // if (LocalTime.now().isAfter(LocalTime.parse(endTime))) {
throw exception(LOG_NOT_UPDATE); // throw exception(LOG_NOT_UPDATE);
} // }
// 更新 // 更新
LogInstanceDO updateObj = BeanUtils.toBean(updateReqVO, LogInstanceDO.class); LogInstanceDO updateObj = BeanUtils.toBean(updateReqVO, LogInstanceDO.class);
@ -320,10 +326,10 @@ public class LogInstanceServiceImpl implements LogInstanceService {
@Override @Override
public LogInstanceDO getUpLog(Long formId) { public LogInstanceDO getUpLog(Long formId) {
List<LogInstanceDO> logInstanceDOS = logInstanceMapper.getUpLog(getLoginUserId(), formId); PageResult<LogInstanceDO> logInstanceDOS = logInstanceMapper.getUpLog(getLoginUserId(), formId);
if (!logInstanceDOS.isEmpty()) { if (!logInstanceDOS.getList().isEmpty()) {
return logInstanceDOS.get(0); return logInstanceDOS.getList().get(0);
} }
return null; return null;

View File

@ -42,4 +42,11 @@ public interface LogReadService {
* @return 日志列表 * @return 日志列表
*/ */
List<LogReadDo> getReadListByReadUserId(Long userId); List<LogReadDo> getReadListByReadUserId(Long userId);
/**
* 获得指定日志的查看状态
* @param logId 日志编号
* @return 阅读状态
*/
Boolean isReadByLogId(Long logId);
} }

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.system.service.worklog; package cn.iocoder.yudao.module.system.service.worklog;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogReadDo; import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogReadDo;
import cn.iocoder.yudao.module.system.dal.mysql.worklog.LogReadMapper; import cn.iocoder.yudao.module.system.dal.mysql.worklog.LogReadMapper;
import cn.iocoder.yudao.module.system.service.worklog.dto.LogReadUserRespDTO; import cn.iocoder.yudao.module.system.service.worklog.dto.LogReadUserRespDTO;
@ -75,4 +76,14 @@ public class LogReadServiceImpl implements LogReadService{
return logReadMapper.selectList(queryWrapper); return logReadMapper.selectList(queryWrapper);
} }
@Override
public Boolean isReadByLogId(Long logId) {
Long count = logReadMapper.selectCount(new LambdaQueryWrapperX<LogReadDo>()
.eq(LogReadDo::getLogInstanceId, logId)
.eq(LogReadDo::getReadStatus, 1));
return count > 0L;
}
} }

View File

@ -9,6 +9,8 @@ import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.*; import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.*;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData.FactoryDataSizeCreateReqVO; import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData.FactoryDataSizeCreateReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData.FactoryDataSizeDetailRespVO; import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData.FactoryDataSizeDetailRespVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.size.vo.SizeRespVO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorydata.FactoryDataSizeDO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factoryinfo.FactoryInfoDO; import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factoryinfo.FactoryInfoDO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.size.SizeDO; import cn.iocoder.yudao.module.smartfactory.dal.dataobject.size.SizeDO;
import cn.iocoder.yudao.module.smartfactory.service.factorydata.FactoryDataService; import cn.iocoder.yudao.module.smartfactory.service.factorydata.FactoryDataService;
@ -28,6 +30,7 @@ import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; import javax.validation.Valid;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -56,7 +59,7 @@ public class FactoryDataController {
@PostMapping("/create-size") @PostMapping("/create-size")
@Operation(summary = "创建工厂出库入库规格数据") @Operation(summary = "创建工厂出库入库规格数据")
@PreAuthorize("@ss.hasPermission('smartfactory:factory-data:create')") @PreAuthorize("@ss.hasPermission('smartfactory:factory-data:create')")
public CommonResult<Long> createSizeData(@Valid @RequestBody FactoryDataSizeCreateReqVO createReqVO) { public CommonResult<Long> createSizeData(@Valid @RequestBody FactoryDataSizeCreateReqVO createReqVO) throws Exception {
return success(factoryDataSizeService.createData(createReqVO)); return success(factoryDataSizeService.createData(createReqVO));
} }
@ -64,7 +67,7 @@ public class FactoryDataController {
@PutMapping("/update") @PutMapping("/update")
@Operation(summary = "更新工厂出库入库数据") @Operation(summary = "更新工厂出库入库数据")
@PreAuthorize("@ss.hasPermission('smartfactory:factory-data:update')") @PreAuthorize("@ss.hasPermission('smartfactory:factory-data:update')")
public CommonResult<Boolean> updateData(@Valid @RequestBody FactoryDataSizeCreateReqVO updateReqVO) { public CommonResult<Boolean> updateData(@Valid @RequestBody FactoryDataSizeCreateReqVO updateReqVO) throws Exception {
dataService.updateData(updateReqVO); dataService.updateData(updateReqVO);
return success(true); return success(true);
@ -81,6 +84,17 @@ public class FactoryDataController {
return success(true); return success(true);
} }
@GetMapping("/getLastSize")
@Operation(summary = "获得指定工厂上一次录入的规格信息")
@Parameter(name = "factoryId", description = "工厂编号", required = true, example = "1000078")
@Parameter(name = "type", description = "出入库类型 | 入库1 出库2", required = true, example = "1")
@PreAuthorize("@ss.hasPermission('smartfactory:factory-data:query')")
public CommonResult<List<Long>> getLastSize(@RequestParam("factoryId") Long factoryId, @RequestParam("type") Integer type) {
List<FactoryDataSizeDO> dataSizeDOS = factoryDataSizeService.getLastSize(factoryId, type == 1 ? Arrays.asList(1,4) : Arrays.asList(2,3));
return success(convertList(dataSizeDOS, FactoryDataSizeDO::getSizeId));
}
@GetMapping("/get") @GetMapping("/get")
@Operation(summary = "获得工厂出库入库数据") @Operation(summary = "获得工厂出库入库数据")
@Parameter(name = "factoryId", description = "工厂编号", required = true, example = "1000078") @Parameter(name = "factoryId", description = "工厂编号", required = true, example = "1000078")
@ -170,6 +184,10 @@ public class FactoryDataController {
List<FactoryDataImportVO> list = ExcelUtils.read(file, FactoryDataImportVO.class); List<FactoryDataImportVO> list = ExcelUtils.read(file, FactoryDataImportVO.class);
// 过滤空行
list = list.stream()
.filter(data -> data.getFactoryName() != null && data.getDate() != null)
.collect(Collectors.toList());
return success(dataService.importUserList(list, type)); return success(dataService.importUserList(list, type));
} }
} }

View File

@ -29,7 +29,7 @@ public class FactoryDataDetailRespVO {
private Integer inTotalNum; private Integer inTotalNum;
@Schema(description = "入库总平方数") @Schema(description = "入库总平方数")
private BigDecimal squareNum; private BigDecimal squareTotalNum;
@Schema(description = "出库总箱数") @Schema(description = "出库总箱数")
private Integer outTotalNum; private Integer outTotalNum;

View File

@ -8,6 +8,7 @@ import lombok.NoArgsConstructor;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDate; import java.time.LocalDate;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
@ -56,6 +57,9 @@ public class FactoryDataImportVO {
@ExcelProperty("出入库数") @ExcelProperty("出入库数")
private Integer num; private Integer num;
@ExcelProperty("入库平方数")
private BigDecimal squareNum;
@ExcelProperty("破损数") @ExcelProperty("破损数")
private Integer damageNum; private Integer damageNum;
} }

View File

@ -14,15 +14,9 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
@Data @Data
public class FactoryDataInfoRespVO { public class FactoryDataInfoRespVO {
@Schema(description = "打包线数据id")
private Long id;
@Schema(description = "工厂id") @Schema(description = "工厂id")
private Long factoryId; private Long factoryId;
@Schema(description = "打包线名称")
private String packageName;
@Schema(description = "日期") @Schema(description = "日期")
private LocalDate date; private LocalDate date;
@ -32,15 +26,6 @@ public class FactoryDataInfoRespVO {
@Schema(description = "规格名称") @Schema(description = "规格名称")
private String sizeName; private String sizeName;
@Schema(description = "规格片数")
private Integer sizePieces;
@Schema(description = "手动打包数")
private Integer num;
@Schema(description = "自动打包数")
private Integer autoNum;
@Schema(description = "入库数量Id") @Schema(description = "入库数量Id")
private Long inNumId; private Long inNumId;

View File

@ -15,12 +15,12 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
@Data @Data
public class FactoryDataSizeCreateReqVO { public class FactoryDataSizeCreateReqVO {
@Schema(description = "打包线数据信息")
private List<PackageDataSaveReqVO> packageData;
@Schema(description = "规格信息", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "规格信息", requiredMode = Schema.RequiredMode.REQUIRED)
private List<FactoryDataSizeSaveReqVO> items; private List<FactoryDataSizeSaveReqVO> items;
@Schema(description = "删除的规格信息")
private List<FactoryDataSizeSaveReqVO> deleteItems;
@Schema(description = "工厂编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000078") @Schema(description = "工厂编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000078")
@NotNull(message = "工厂编号不能为空") @NotNull(message = "工厂编号不能为空")
private Long factoryId; private Long factoryId;

View File

@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.siz
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.List; import java.util.List;
@ -19,6 +20,9 @@ public class FactoryDataSizeDetailRespVO {
@Schema(description = "日期", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-05-14") @Schema(description = "日期", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-05-14")
private LocalDate date; private LocalDate date;
@Schema(description = "是否可编辑 | 0否 1是", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Integer isEdit;
/** /**
* 入库数据 * 入库数据
*/ */
@ -32,30 +36,21 @@ public class FactoryDataSizeDetailRespVO {
@Data @Data
public static class InItem { public static class InItem {
@Schema(description = "打包线数据id")
private Long id;
@Schema(description = "打包线名称")
private String packageName;
@Schema(description = "规格id") @Schema(description = "规格id")
private Long sizeId; private Long sizeId;
@Schema(description = "规格名称") @Schema(description = "规格名称")
private String sizeName; private String sizeName;
@Schema(description = "手动打包数")
private Integer num;
@Schema(description = "自动打包数")
private Integer autoNum;
@Schema(description = "入库数Id") @Schema(description = "入库数Id")
private Long inNumId; private Long inNumId;
@Schema(description = "入库数") @Schema(description = "入库数")
private Integer inNum; private Integer inNum;
@Schema(description = "入库平方数")
private BigDecimal squareNum;
@Schema(description = "打包破损数") @Schema(description = "打包破损数")
private Integer damageNum; private Integer damageNum;

View File

@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
@Schema(description = "管理后台 - 工厂规格数据修改 Request VO") @Schema(description = "管理后台 - 工厂规格数据修改 Request VO")
@Data @Data
@ -17,16 +18,15 @@ public class FactoryDataSizeSaveReqVO {
@NotNull(message = "规格名称不能为空") @NotNull(message = "规格名称不能为空")
private String sizeName; private String sizeName;
@Schema(description = "规格片数", requiredMode = Schema.RequiredMode.REQUIRED, example = "4")
@NotNull(message = "规格片数不能为空")
private Integer sizePieces;
@Schema(description = "入库数量Id") @Schema(description = "入库数量Id")
private Long inNumId; private Long inNumId;
@Schema(description = "入库数量") @Schema(description = "入库数量")
private Integer inNum; private Integer inNum;
@Schema(description = "入库平方数")
private BigDecimal squareNum;
@Schema(description = "入库破损数量Id") @Schema(description = "入库破损数量Id")
private Long inDamageNumId; private Long inDamageNumId;

View File

@ -35,6 +35,10 @@ public class FactoryInfoRespVO {
@ExcelProperty("工厂业务类型") @ExcelProperty("工厂业务类型")
private String businessType; private String businessType;
@Schema(description = "结算方式", example = "1")
@ExcelProperty("结算方式")
private Integer settlementMethod;
@Schema(description = "工厂简介", example = "这是一个工厂简介") @Schema(description = "工厂简介", example = "这是一个工厂简介")
@ExcelProperty("工厂简介") @ExcelProperty("工厂简介")
private String description; private String description;

View File

@ -30,6 +30,9 @@ public class FactoryInfoSaveReqVO {
@Schema(description = "工厂业务类型 根据字典business_type来", example = "1") @Schema(description = "工厂业务类型 根据字典business_type来", example = "1")
private String businessType; private String businessType;
@Schema(description = "工厂结算方式 | 字典值 sf_settlement_method", example = "1")
private Integer settlementMethod;
@Schema(description = "工厂简介", example = "这是一个工厂简介") @Schema(description = "工厂简介", example = "这是一个工厂简介")
private String description; private String description;

View File

@ -21,6 +21,9 @@ public class FactorySimpleRespVO {
@Schema(description = "工厂简称", requiredMode = Schema.RequiredMode.REQUIRED, example = "第一工厂") @Schema(description = "工厂简称", requiredMode = Schema.RequiredMode.REQUIRED, example = "第一工厂")
private String shortName; private String shortName;
@Schema(description = "结算方式")
private Integer settlementMethod;
@Schema(description = "监控列表") @Schema(description = "监控列表")
private List<CameraSimpleRespVO> subsidiary; private List<CameraSimpleRespVO> subsidiary;
} }

View File

@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*; import lombok.*;
import java.math.BigDecimal;
import java.time.LocalDate; import java.time.LocalDate;
/** /**
@ -43,9 +44,9 @@ public class FactoryDataSizeDO extends BaseDO {
private String sizeName; private String sizeName;
/** /**
* 规格片 * 平方
*/ */
private String sizePieces; private BigDecimal squareNum;
/** /**
* 数据类型 * 数据类型

View File

@ -55,6 +55,10 @@ public class FactoryInfoDO extends BaseDO {
* 工厂业务类型 根据字典business_type来 * 工厂业务类型 根据字典business_type来
*/ */
private String businessType; private String businessType;
/**
* 工厂结算方式 字典值 sf_settlement_method
*/
private Integer settlementMethod;
/** /**
* 工厂简介 * 工厂简介
*/ */

View File

@ -1,11 +1,14 @@
package cn.iocoder.yudao.module.smartfactory.dal.mysql.factorydata; package cn.iocoder.yudao.module.smartfactory.dal.mysql.factorydata;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataInfoRespVO; import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataInfoRespVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataPageReqVO; import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataPageReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataTotalVO; import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataTotalVO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorydata.FactoryDataDO; import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorydata.FactoryDataDO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorydata.FactoryDataSizeDO;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
@ -39,4 +42,6 @@ public interface FactoryDataMapper extends BaseMapperX<FactoryDataDO> {
} }
FactoryDataTotalVO selectDataSum(@Param("factoryId") Long factoryId, @Param("date") LocalDate[] date); FactoryDataTotalVO selectDataSum(@Param("factoryId") Long factoryId, @Param("date") LocalDate[] date);
} }

View File

@ -1,5 +1,7 @@
package cn.iocoder.yudao.module.smartfactory.dal.mysql.factorydata; package cn.iocoder.yudao.module.smartfactory.dal.mysql.factorydata;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataInfoRespVO; import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataInfoRespVO;
@ -49,4 +51,7 @@ public interface FactoryDataSizeMapper extends BaseMapperX<FactoryDataSizeDO> {
} }
List<FactoryDataInfoRespVO> selectSUMByDateTimes(@Param("dateTime") LocalDateTime[] dateTimes); List<FactoryDataInfoRespVO> selectSUMByDateTimes(@Param("dateTime") LocalDateTime[] dateTimes);
List<FactoryDataSizeDO> selectLastSize(@Param("factoryId") Long factoryId,
@Param("types") List<Integer> types);
} }

View File

@ -28,9 +28,6 @@ public class FactoryDataJob {
@Resource @Resource
private FactoryDataSizeService dataSizeService; private FactoryDataSizeService dataSizeService;
@Resource
private PackageDataService packageDataService;
@Resource @Resource
private FactoryDataService factoryDataService; private FactoryDataService factoryDataService;

View File

@ -0,0 +1,38 @@
package cn.iocoder.yudao.module.smartfactory.framework.util;
import org.apache.logging.log4j.util.Strings;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* String 工具类
*/
public class StringUtil {
/**
* 转换规格片数
* @param sizeName 规格名称
* @return 片数
*/
public static Integer sizeNameAnalysis(String sizeName) {
if (Strings.isEmpty(sizeName)) {
return 1;
}
String[] split = sizeName.split("\\*");
if (split.length >= 3) {
Pattern pattern = Pattern.compile("\\d+"); // 匹配数字的正则表达式
Matcher matcher = pattern.matcher(split[2]);
if (matcher.find()) {
return Integer.valueOf(matcher.group()); // 获取匹配的数字字符串
}
}
return 1;
}
}

View File

@ -5,6 +5,7 @@ import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.*;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData.FactoryDataSizeCreateReqVO; import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData.FactoryDataSizeCreateReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData.FactoryDataSizeDetailRespVO; import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData.FactoryDataSizeDetailRespVO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorydata.FactoryDataDO; import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorydata.FactoryDataDO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorydata.FactoryDataSizeDO;
import javax.validation.Valid; import javax.validation.Valid;
import java.time.LocalDate; import java.time.LocalDate;
@ -31,7 +32,7 @@ public interface FactoryDataService {
* *
* @param updateReqVO 更新信息 * @param updateReqVO 更新信息
*/ */
void updateData(@Valid FactoryDataSizeCreateReqVO updateReqVO); void updateData(@Valid FactoryDataSizeCreateReqVO updateReqVO) throws Exception;
/** /**
* 删除工厂出库入库数据 * 删除工厂出库入库数据
@ -64,6 +65,8 @@ public interface FactoryDataService {
*/ */
FactoryDataTotalVO getDataTotal(Long factoryId, LocalDate[] date); FactoryDataTotalVO getDataTotal(Long factoryId, LocalDate[] date);
/** /**
* 获取当天的所有数据 * 获取当天的所有数据
* *
@ -97,4 +100,8 @@ public interface FactoryDataService {
* @return 结果 * @return 结果
*/ */
FactoryImportRespVO importUserList(List<FactoryDataImportVO> list, Integer type); FactoryImportRespVO importUserList(List<FactoryDataImportVO> list, Integer type);
String convertSquare(Object num, Integer type, String sizeName);
} }

View File

@ -19,6 +19,7 @@ import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factoryinfo.FactoryIn
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.packagedata.PackageDataDO; import cn.iocoder.yudao.module.smartfactory.dal.dataobject.packagedata.PackageDataDO;
import cn.iocoder.yudao.module.smartfactory.dal.mysql.factorydata.FactoryDataMapper; import cn.iocoder.yudao.module.smartfactory.dal.mysql.factorydata.FactoryDataMapper;
import cn.iocoder.yudao.module.smartfactory.dal.mysql.factorydata.FactoryDataSizeMapper; import cn.iocoder.yudao.module.smartfactory.dal.mysql.factorydata.FactoryDataSizeMapper;
import cn.iocoder.yudao.module.smartfactory.framework.util.StringUtil;
import cn.iocoder.yudao.module.smartfactory.service.factoryinfo.FactoryInfoService; import cn.iocoder.yudao.module.smartfactory.service.factoryinfo.FactoryInfoService;
import cn.iocoder.yudao.module.smartfactory.service.packageInfo.PackageService; import cn.iocoder.yudao.module.smartfactory.service.packageInfo.PackageService;
import cn.iocoder.yudao.module.smartfactory.service.packagedata.PackageDataService; import cn.iocoder.yudao.module.smartfactory.service.packagedata.PackageDataService;
@ -30,6 +31,7 @@ import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.*; import java.util.*;
@ -59,15 +61,9 @@ public class FactoryDataServiceImpl implements FactoryDataService {
@Resource @Resource
private FactoryInfoService factoryInfoService; private FactoryInfoService factoryInfoService;
@Resource
private PackageDataService packageDataService;
@Resource @Resource
private FactoryDataSizeMapper factoryDataSizeMapper; private FactoryDataSizeMapper factoryDataSizeMapper;
@Resource
private PackageService packageService;
@Override @Override
public Long createData(List<FactoryDataDO> factoryDataDOS) { public Long createData(List<FactoryDataDO> factoryDataDOS) {
@ -79,7 +75,7 @@ public class FactoryDataServiceImpl implements FactoryDataService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void updateData(FactoryDataSizeCreateReqVO updateReqVO) { public void updateData(FactoryDataSizeCreateReqVO updateReqVO) throws Exception {
// 修改 规格明细数据 // 修改 规格明细数据
dataSizeService.updateData(updateReqVO); dataSizeService.updateData(updateReqVO);
@ -88,13 +84,6 @@ public class FactoryDataServiceImpl implements FactoryDataService {
List<FactoryDataDO> factoryDataDOS = dataMapper.selectListByFactoryAndDate(updateReqVO.getFactoryId(), updateReqVO.getDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); List<FactoryDataDO> factoryDataDOS = dataMapper.selectListByFactoryAndDate(updateReqVO.getFactoryId(), updateReqVO.getDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
if (factoryDataDOS != null && !factoryDataDOS.isEmpty()) { if (factoryDataDOS != null && !factoryDataDOS.isEmpty()) {
PackageDataCreateReqVO createReqVO = new PackageDataCreateReqVO();
createReqVO.setPackageData(updateReqVO.getPackageData());
createReqVO.setFactoryId(updateReqVO.getFactoryId());
createReqVO.setPackageDate(updateReqVO.getDate());
//获得 打包线数据对象
List<PackageDataDO> packageDataDOS = PackageDataConvert.INSTANCE.convertList(createReqVO);
// 更新 // 更新
factoryDataDOS.forEach(data -> { factoryDataDOS.forEach(data -> {
@ -107,12 +96,9 @@ public class FactoryDataServiceImpl implements FactoryDataService {
break; break;
//入库数据 //入库数据
case 2: case 2:
Integer damageNum = packageDataDOS.stream().mapToInt(PackageDataDO::getDamageNum).sum()
+ updateReqVO.getItems().stream().mapToInt(FactoryDataSizeSaveReqVO::getInDamageNum).sum();
data.setTotalNum(packageDataDOS.stream().mapToInt(info -> info.getNum() + info.getAutoNum()).sum()); data.setTotalNum(updateReqVO.getItems().stream().mapToInt(FactoryDataSizeSaveReqVO::getInNum).sum());
data.setDamageNum(damageNum); data.setDamageNum(updateReqVO.getItems().stream().mapToInt(FactoryDataSizeSaveReqVO::getInDamageNum).sum());
data.setSquareNum(packageDataDOS.stream().map(PackageDataDO::getSquareNum).reduce(BigDecimal.ZERO, BigDecimal::add));
} }
}); });
@ -127,9 +113,6 @@ public class FactoryDataServiceImpl implements FactoryDataService {
//删除出入库 规格数据 //删除出入库 规格数据
dataSizeService.deleteData(factoryId, date); dataSizeService.deleteData(factoryId, date);
//删除打包线数据
packageDataService.deletePackageData(factoryId, date);
} }
@Override @Override
@ -139,23 +122,17 @@ public class FactoryDataServiceImpl implements FactoryDataService {
respVO.setFactoryId(factoryId); respVO.setFactoryId(factoryId);
respVO.setDate(LocalDate.parse(date)); respVO.setDate(LocalDate.parse(date));
//获得 明细数据 //获得 明细数据
List<FactoryDataInfoRespVO> infoRespVOS = dataSizeService.getDetailList(factoryId, new LocalDate[]{LocalDate.parse(date), LocalDate.parse(date)}, null); List<FactoryDataInfoRespVO> infoRespVOS = dataSizeService.getDetailList(factoryId, new LocalDate[]{LocalDate.parse(date), LocalDate.parse(date)}, null);
List<FactoryDataSizeDetailRespVO.InItem> packageInfo = infoRespVOS.stream()
.filter(info -> (info.getInDamageNum() != null && info.getInNum() == null) || info.getNum() != null || info.getAutoNum() != null)
.map(info -> BeanUtil.toBean(info, FactoryDataSizeDetailRespVO.InItem.class))
.collect(Collectors.toList());
List<FactoryDataSizeDetailRespVO.InItem> inItems = infoRespVOS.stream() List<FactoryDataSizeDetailRespVO.InItem> inItems = infoRespVOS.stream()
.filter(info -> info.getInNum() != null) .filter(info -> info.getInNum() != null || info.getInDamageNum() != null)
.map(info -> { .map(info -> {
FactoryDataSizeDetailRespVO.InItem inItem = BeanUtil.toBean(info, FactoryDataSizeDetailRespVO.InItem.class); FactoryDataSizeDetailRespVO.InItem inItem = BeanUtil.toBean(info, FactoryDataSizeDetailRespVO.InItem.class);
inItem.setIsEnable(1); inItem.setIsEnable(1);
return inItem; return inItem;
}) })
.collect(Collectors.toList()); .collect(Collectors.toList());
inItems.addAll(packageInfo);
respVO.setInItems(inItems); respVO.setInItems(inItems);
respVO.setOutItems( respVO.setOutItems(
@ -164,6 +141,14 @@ public class FactoryDataServiceImpl implements FactoryDataService {
.map(info -> BeanUtil.toBean(info, FactoryDataSizeDetailRespVO.OutItem.class)) .map(info -> BeanUtil.toBean(info, FactoryDataSizeDetailRespVO.OutItem.class))
.collect(Collectors.toList())); .collect(Collectors.toList()));
if (CollUtil.isNotEmpty(infoRespVOS)) {
LocalDate localDate = infoRespVOS.get(0).getCreateTime().toLocalDate();
if (localDate.isEqual(LocalDate.now())) {
respVO.setIsEdit(1);
}else {
respVO.setIsEdit(0);
}
}
return respVO; return respVO;
} }
@ -198,18 +183,13 @@ public class FactoryDataServiceImpl implements FactoryDataService {
dataDetailRespVO.setDate(date.getKey()); dataDetailRespVO.setDate(date.getKey());
//设置入库总数 //设置入库总数
int inSum = date.getValue().stream() int inSum = date.getValue().stream()
.map(info -> { .map(info -> Optional.ofNullable(info.getInNum()).orElse(0))
Integer num = Optional.ofNullable(info.getNum()).orElse(0);
Integer autoNum = Optional.ofNullable(info.getAutoNum()).orElse(0);
Integer inNUm = Optional.ofNullable(info.getInNum()).orElse(0);
return num + autoNum + inNUm;
})
.mapToInt(Integer::intValue).sum(); .mapToInt(Integer::intValue).sum();
dataDetailRespVO.setInTotalNum(inSum == 0 ? null : inSum); dataDetailRespVO.setInTotalNum(inSum == 0 ? null : inSum);
// //设置入库平方 //设置入库平方总数数
// dataDetailRespVO.setSquareNum(date.getValue().stream().map(FactoryDataInfoRespVO::getSquareNum) dataDetailRespVO.setSquareTotalNum(date.getValue().stream().map(FactoryDataInfoRespVO::getSquareNum)
// .filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)); .filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
//设置出库总数 //设置出库总数
int outTotalNum = date.getValue().stream().filter(info -> info.getOutNum() != null) int outTotalNum = date.getValue().stream().filter(info -> info.getOutNum() != null)
@ -223,15 +203,9 @@ public class FactoryDataServiceImpl implements FactoryDataService {
respVO.setOutDamageNum(Optional.ofNullable(info.getOutDamageNum()).orElse(0)); respVO.setOutDamageNum(Optional.ofNullable(info.getOutDamageNum()).orElse(0));
return respVO; return respVO;
}).mapToInt(info -> info.getInDamageNum() + info.getOutDamageNum()).sum(); }).mapToInt(info -> info.getInDamageNum() + info.getOutDamageNum()).sum();
dataDetailRespVO.setDamageNum(sum == 0 ? null : sum); dataDetailRespVO.setDamageNum(sum == 0 ? null : sum);
date.getValue().forEach(info -> { // 设置出入库规格详情
int num = Optional.ofNullable(info.getNum()).orElse(0);
int autoNum = Optional.ofNullable(info.getAutoNum()).orElse(0);
int inNum = Optional.ofNullable(info.getInNum()).orElse(0);
info.setInNum((num + autoNum + inNum) == 0 ? null : (num + autoNum + inNum));
});
dataDetailRespVO.setItems(date.getValue()); dataDetailRespVO.setItems(date.getValue());
if (date.getValue().get(0).getCreateTime().toLocalDate().equals(LocalDate.now())) { if (date.getValue().get(0).getCreateTime().toLocalDate().equals(LocalDate.now())) {
@ -286,7 +260,8 @@ public class FactoryDataServiceImpl implements FactoryDataService {
throw exception(FACTORY_IMPORT_LIST_IS_EMPTY); throw exception(FACTORY_IMPORT_LIST_IS_EMPTY);
} }
FactoryImportRespVO respVO = FactoryImportRespVO.builder().createUsernames(new ArrayList<>()).updateUsernames(new ArrayList<>()).failureUsernames(new LinkedHashMap<>()).build(); FactoryImportRespVO respVO = FactoryImportRespVO.builder().createUsernames(new ArrayList<>()).
updateUsernames(new ArrayList<>()).failureUsernames(new LinkedHashMap<>()).build();
list.forEach(data -> { list.forEach(data -> {
@ -305,39 +280,9 @@ public class FactoryDataServiceImpl implements FactoryDataService {
// 获取 规格名称 // 获取 规格名称
String sizeName = data.getSizeName().split(":")[1]; String sizeName = data.getSizeName().split(":")[1];
// PackageDO packageDO = packageService.getPackageByFactoryIdAndSize(factoryId, sizeId);
// if (packageDO != null && (data.getNum() != null || data.getAutoNum() != null)) {
//
// PackageDataDO packageDataDO = BeanUtils.toBean(packageDO, PackageDataDO.class);
// packageDataDO.setId(null);
// packageDataDO.setPackageDate(data.getDate());
// packageDataDO.setPackageId(packageDO.getId());
// packageDataDO.setPackageName(packageDO.getName());
// packageDataDO.setSizeName(sizeName);
// packageDataDO.setNum(data.getNum());
// packageDataDO.setAutoNum(data.getAutoNum());
// packageDataDO.setDamageNum(data.getDamageNum());
// packageDataDO.setCreator(getLoginUserId().toString());
// packageDataDO.setUpdater(null);
// packageDataDO.setCreateTime(LocalDateTime.now());
//
// //计算平方数
// String[] size = sizeName.split("\\*");
// BigDecimal squareNum = BigDecimal.valueOf((double) Integer.parseInt(size[0]) / 1000)
// .multiply(BigDecimal.valueOf((double) Integer.parseInt(size[1]) / 1000))
// .multiply(BigDecimal.valueOf(packageDataDO.getSizePieces()))
// .multiply(BigDecimal.valueOf(Integer.sum(packageDataDO.getNum(), packageDataDO.getAutoNum())));
//
// //设置平方数
// packageDataDO.setSquareNum(squareNum);
//
// // 插入打包线数据
// packageDataService.create(packageDataDO);
// }
List<FactoryDataSizeDO> factoryDataSizeDOs = new ArrayList<>(); List<FactoryDataSizeDO> factoryDataSizeDOs = new ArrayList<>();
if (data.getNum() != null) { if (data.getNum() != null || data.getSquareNum() != null) {
FactoryDataSizeDO dataSizeDO = new FactoryDataSizeDO(); FactoryDataSizeDO dataSizeDO = new FactoryDataSizeDO();
//设置规格信息 //设置规格信息
@ -348,9 +293,28 @@ public class FactoryDataServiceImpl implements FactoryDataService {
dataSizeDO.setDate(data.getDate()); dataSizeDO.setDate(data.getDate());
// 根据type 设置入库数还是出库数 // 根据type 设置入库数还是出库数
dataSizeDO.setType(type == 1 ? 4 : 2); dataSizeDO.setType(type == 1 ? 4 : 2);
dataSizeDO.setNum(data.getNum()); try {
if (sizeName.contains("*")) {
dataSizeDO.setNum(
data.getSquareNum() != null ? Integer.parseInt(convertSquare(data.getSquareNum(), 2, sizeName)) : data.getNum()
);
dataSizeDO.setSquareNum(
data.getNum() != null ? new BigDecimal(convertSquare(data.getNum(), 1, sizeName)) : data.getSquareNum()
);
}else {
dataSizeDO.setNum(data.getNum());
dataSizeDO.setSquareNum(data.getSquareNum());
}
} catch (Exception ex) {
respVO.getFailureUsernames().put(data.getFactoryName() + "-" + data.getDate(), "请正确填写入库数或者入库平方数");
return;
}
factoryDataSizeDOs.add(dataSizeDO); factoryDataSizeDOs.add(dataSizeDO);
}else {
respVO.getFailureUsernames().put(data.getFactoryName() + "-" + data.getDate(), "请正确填写入库数或者入库平方数");
return;
} }
if (data.getDamageNum() != null) { if (data.getDamageNum() != null) {
@ -371,7 +335,7 @@ public class FactoryDataServiceImpl implements FactoryDataService {
factoryDataSizeMapper.insertBatch(factoryDataSizeDOs); factoryDataSizeMapper.insertBatch(factoryDataSizeDOs);
respVO.getCreateUsernames().add(data.getFactoryName() + "-" + data.getDate()); // respVO.getCreateUsernames().add(data.getFactoryName() + "-" + data.getDate());
}); });
return respVO; return respVO;
@ -394,22 +358,21 @@ public class FactoryDataServiceImpl implements FactoryDataService {
FactoryInfoDO factoryInfoDO = factoryInfoService.getFactoryByName(factoryName); FactoryInfoDO factoryInfoDO = factoryInfoService.getFactoryByName(factoryName);
List<Integer> dataType = new ArrayList<>(); List<Integer> dataType = new ArrayList<>();
if (data.getNum() != null && data.getDamageNum() != null) { if ((data.getNum() != null || data.getSquareNum() != null) && data.getDamageNum() != null) {
dataType = type == 1 ? Arrays.asList(1,4) : Arrays.asList(2,3); dataType = type == 1 ? Arrays.asList(1,4) : Arrays.asList(2,3);
} }
if (data.getNum() != null && data.getDamageNum() == null) { if ((data.getNum() != null || data.getSquareNum() != null) && data.getDamageNum() == null) {
dataType = type == 1 ? Collections.singletonList(4) : Collections.singletonList(2); dataType = type == 1 ? Collections.singletonList(4) : Collections.singletonList(2);
} }
if (data.getNum() == null && data.getDamageNum() != null) { if (data.getNum() == null && data.getSquareNum() == null && data.getDamageNum() != null) {
dataType = type == 1 ? Collections.singletonList(1) : Collections.singletonList(3); dataType = type == 1 ? Collections.singletonList(1) : Collections.singletonList(3);
} }
// 获取 规格ID // 获取 规格ID
Long sizeId = Long.valueOf(sizeName.split(":")[0]); Long sizeId = Long.valueOf(sizeName.split(":")[0]);
Long count = factoryDataSizeMapper.selectCountByType(factoryInfoDO.getId(), sizeId, date, dataType); Long count = factoryDataSizeMapper.selectCountByType(factoryInfoDO.getId(), sizeId, date, dataType);
// List<PackageDataDO> packageDOs = packageDataService.getListByFactoryIdAndDate(factoryInfoDO.getId(), date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
if (count > 0L) { if (count > 0L) {
throw exception(PACKAGE_DATA_EXISTS); throw exception(PACKAGE_DATA_EXISTS);
@ -417,4 +380,33 @@ public class FactoryDataServiceImpl implements FactoryDataService {
return factoryInfoDO.getId(); return factoryInfoDO.getId();
} }
@Override
public String convertSquare(Object num, Integer type, String sizeName) {
int size = Integer.parseInt(sizeName.split("\\*")[0]);
int size1 = Integer.parseInt(sizeName.split("\\*")[1]);
// 转换规格片数
int unit = StringUtil.sizeNameAnalysis(sizeName);
// 判断是箱数转换平方数的情况
if (type == 1) {
//计算平方数
return BigDecimal.valueOf((double) size / 1000)
.multiply(BigDecimal.valueOf((double) size1 / 1000))
.multiply(BigDecimal.valueOf(unit))
.multiply(BigDecimal.valueOf((Integer) num)).toString();
}else {
// 计算箱数
BigDecimal sizeNum = BigDecimal.valueOf((double) size / 1000)
.multiply(BigDecimal.valueOf((double) size1 / 1000))
.multiply(BigDecimal.valueOf(unit));
BigDecimal squareNum = new BigDecimal(String.valueOf(num));
return squareNum.divide(sizeNum, 0, RoundingMode.HALF_UP).toString();
}
}
} }

View File

@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.smartfactory.service.factorydata;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataInfoRespVO; import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataInfoRespVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData.FactoryDataSizeCreateReqVO; import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData.FactoryDataSizeCreateReqVO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorydata.FactoryDataSizeDO;
import javax.validation.Valid; import javax.validation.Valid;
import java.time.LocalDate; import java.time.LocalDate;
@ -21,14 +22,14 @@ public interface FactoryDataSizeService {
* @param createReqVO 创建信息 * @param createReqVO 创建信息
* @return 编号 * @return 编号
*/ */
Long createData(@Valid FactoryDataSizeCreateReqVO createReqVO); Long createData(@Valid FactoryDataSizeCreateReqVO createReqVO) throws Exception;
/** /**
* 更新工厂规格数据 * 更新工厂规格数据
* *
* @param updateReqVO 更新信息 * @param updateReqVO 更新信息
*/ */
void updateData(@Valid FactoryDataSizeCreateReqVO updateReqVO); void updateData(@Valid FactoryDataSizeCreateReqVO updateReqVO) throws Exception;
/** /**
* 删除工厂规格数据 * 删除工厂规格数据
@ -50,4 +51,12 @@ public interface FactoryDataSizeService {
* @return 出入库规格数据之和 * @return 出入库规格数据之和
*/ */
List<FactoryDataInfoRespVO> getSUMByDateTimes(LocalDateTime[] dateTimes); List<FactoryDataInfoRespVO> getSUMByDateTimes(LocalDateTime[] dateTimes);
/**
* 获得指定工厂上一次录入的规格信息
* @param factoryId 工厂编号
* @param dataTypes 数据类型
* @return 规格详情列表
*/
List<FactoryDataSizeDO> getLastSize(Long factoryId, List<Integer> dataTypes);
} }

View File

@ -1,24 +1,29 @@
package cn.iocoder.yudao.module.smartfactory.service.factorydata; package cn.iocoder.yudao.module.smartfactory.service.factorydata;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataInfoRespVO; import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataInfoRespVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData.FactoryDataSizeCreateReqVO; import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData.FactoryDataSizeCreateReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData.FactoryDataSizeSaveReqVO; import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData.FactoryDataSizeSaveReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.packagedata.vo.PackageDataCreateReqVO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorydata.FactoryDataDO; import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorydata.FactoryDataDO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorydata.FactoryDataSizeDO; import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorydata.FactoryDataSizeDO;
import cn.iocoder.yudao.module.smartfactory.dal.mysql.factorydata.FactoryDataSizeMapper; import cn.iocoder.yudao.module.smartfactory.dal.mysql.factorydata.FactoryDataSizeMapper;
import cn.iocoder.yudao.module.smartfactory.service.packagedata.PackageDataService;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.LocalTime; import java.time.LocalTime;
import java.util.*; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.smartfactory.enums.ErrorCodeConstants.PACKAGE_DATA_EXISTS; import static cn.iocoder.yudao.module.smartfactory.enums.ErrorCodeConstants.PACKAGE_DATA_EXISTS;
@ -36,16 +41,13 @@ public class FactoryDataSizeServiceImpl implements FactoryDataSizeService{
@Resource @Resource
private FactoryDataSizeMapper factoryDataSizeMapper; private FactoryDataSizeMapper factoryDataSizeMapper;
@Resource
private PackageDataService packageDataService;
@Resource @Resource
@Lazy // 循环依赖避免报错 @Lazy // 循环依赖避免报错
private FactoryDataService factoryDataService; private FactoryDataService factoryDataService;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Long createData(FactoryDataSizeCreateReqVO createReqVO) { public Long createData(FactoryDataSizeCreateReqVO createReqVO) throws Exception {
//校验 当前日期得 入库数据是否已经录入 //校验 当前日期得 入库数据是否已经录入
if (createReqVO.getType() == 2) { if (createReqVO.getType() == 2) {
@ -114,7 +116,7 @@ public class FactoryDataSizeServiceImpl implements FactoryDataSizeService{
factoryDataSizeDOs.add(dataSizeDO); factoryDataSizeDOs.add(dataSizeDO);
} }
if (reqVO.getInNum() != null) { if (reqVO.getInNum() != null || reqVO.getSquareNum() != null) {
FactoryDataSizeDO dataSizeDO = BeanUtils.toBean(reqVO, FactoryDataSizeDO.class); FactoryDataSizeDO dataSizeDO = BeanUtils.toBean(reqVO, FactoryDataSizeDO.class);
@ -124,6 +126,22 @@ public class FactoryDataSizeServiceImpl implements FactoryDataSizeService{
//设置入库数 //设置入库数
dataSizeDO.setType(4); dataSizeDO.setType(4);
dataSizeDO.setNum(reqVO.getInNum()); dataSizeDO.setNum(reqVO.getInNum());
try {
if (reqVO.getSizeName().contains("*")) {
dataSizeDO.setNum(
reqVO.getSquareNum() != null ? Integer.parseInt(factoryDataService.convertSquare(reqVO.getSquareNum(), 2, reqVO.getSizeName())) : reqVO.getInNum()
);
dataSizeDO.setSquareNum(
reqVO.getInNum() != null ? new BigDecimal(factoryDataService.convertSquare(reqVO.getInNum(), 1, reqVO.getSizeName())) : reqVO.getSquareNum()
);
}else {
dataSizeDO.setNum(reqVO.getInNum());
dataSizeDO.setSquareNum(reqVO.getSquareNum());
}
} catch (Exception ex) {
throw new Exception(ex);
}
factoryDataSizeDOs.add(dataSizeDO); factoryDataSizeDOs.add(dataSizeDO);
} }
@ -131,46 +149,39 @@ public class FactoryDataSizeServiceImpl implements FactoryDataSizeService{
factoryDataSizeMapper.insertBatch(factoryDataSizeDOs); factoryDataSizeMapper.insertBatch(factoryDataSizeDOs);
// 判断打包线数据不为空时 同步插入打包线数据
if (!createReqVO.getPackageData().isEmpty()) {
if (createReqVO.getPackageData().get(0).getId() != null) {
PackageDataCreateReqVO updateVO = new PackageDataCreateReqVO();
updateVO.setPackageData(createReqVO.getPackageData());
//更新 打包线数据
packageDataService.updatePackageData(updateVO);
}else {
PackageDataCreateReqVO packCreateReqVO = new PackageDataCreateReqVO();
packCreateReqVO.setFactoryId(createReqVO.getPackageData().get(0).getFactoryId());
packCreateReqVO.setPackageData(createReqVO.getPackageData());
packCreateReqVO.setPackageDate(createReqVO.getDate());
//插入打包线数据
packageDataService.createPackageData(packCreateReqVO);
}
}
return (long) factoryDataSizeDOs.size(); return (long) factoryDataSizeDOs.size();
} }
@Override @Override
public void updateData(FactoryDataSizeCreateReqVO updateReqVO) { public void updateData(FactoryDataSizeCreateReqVO updateReqVO) throws Exception {
// 更新 // 更新
List<FactoryDataSizeDO> createSizeDos = new ArrayList<>(); List<FactoryDataSizeDO> createSizeDos = new ArrayList<>();
List<FactoryDataSizeDO> factoryDataSizeDOs = new ArrayList<>(); List<FactoryDataSizeDO> factoryDataSizeDOs = new ArrayList<>();
for (FactoryDataSizeSaveReqVO reqVO : updateReqVO.getItems()) { for (FactoryDataSizeSaveReqVO reqVO : updateReqVO.getItems()) {
if (reqVO.getInNum() != null) { if (reqVO.getInNum() != null || reqVO.getSquareNum() != null) {
FactoryDataSizeDO dataSizeDO = new FactoryDataSizeDO(); FactoryDataSizeDO dataSizeDO = new FactoryDataSizeDO();
//设置入库数 //设置入库数
dataSizeDO.setId(reqVO.getInNumId()); dataSizeDO.setId(reqVO.getInNumId());
dataSizeDO.setNum(reqVO.getInNum()); try {
if (reqVO.getSizeName().contains("*")) {
dataSizeDO.setNum(
reqVO.getSquareNum() != null ? Integer.parseInt(factoryDataService.convertSquare(reqVO.getSquareNum(), 2, reqVO.getSizeName())) : reqVO.getInNum()
);
dataSizeDO.setSquareNum(
reqVO.getInNum() != null ? new BigDecimal(factoryDataService.convertSquare(reqVO.getInNum(), 1, reqVO.getSizeName())) : reqVO.getSquareNum()
);
}else {
dataSizeDO.setNum(reqVO.getInNum());
dataSizeDO.setSquareNum(reqVO.getSquareNum());
}
} catch (Exception ex) {
throw new Exception(ex);
}
if (reqVO.getInNumId() == null) { if (reqVO.getInNumId() == null) {
@ -249,6 +260,12 @@ public class FactoryDataSizeServiceImpl implements FactoryDataSizeService{
} }
} }
// 处理删除的数据
List<Long> deleteIds = updateReqVO.getDeleteItems().stream()
.flatMap(item -> Stream.of(item.getInNumId(), item.getInDamageNumId(), item.getOutNumId(), item.getOutDamageNumId()))
.filter(ObjectUtil::isNotNull)
.collect(Collectors.toList());
if (!factoryDataSizeDOs.isEmpty()) { if (!factoryDataSizeDOs.isEmpty()) {
factoryDataSizeMapper.updateBatch(factoryDataSizeDOs); factoryDataSizeMapper.updateBatch(factoryDataSizeDOs);
} }
@ -257,17 +274,10 @@ public class FactoryDataSizeServiceImpl implements FactoryDataSizeService{
factoryDataSizeMapper.insertBatch(createSizeDos); factoryDataSizeMapper.insertBatch(createSizeDos);
} }
// 判断 是否有打包线数据 if (CollectionUtil.isNotEmpty(deleteIds)) {
if (!updateReqVO.getPackageData().isEmpty()) { factoryDataSizeMapper.deleteBatchIds(deleteIds);
PackageDataCreateReqVO packCreateReqVO = new PackageDataCreateReqVO();
packCreateReqVO.setFactoryId(updateReqVO.getFactoryId());
packCreateReqVO.setPackageDate(updateReqVO.getDate());
packCreateReqVO.setPackageData(updateReqVO.getPackageData());
//插入打包线数据
packageDataService.updatePackageData(packCreateReqVO);
} }
} }
@Override @Override
@ -296,4 +306,10 @@ public class FactoryDataSizeServiceImpl implements FactoryDataSizeService{
return factoryDataSizeMapper.selectSUMByDateTimes(dateTimes); return factoryDataSizeMapper.selectSUMByDateTimes(dateTimes);
} }
@Override
public List<FactoryDataSizeDO> getLastSize(Long factoryId, List<Integer> dataTypes) {
return factoryDataSizeMapper.selectLastSize(factoryId, dataTypes);
}
} }

View File

@ -11,90 +11,13 @@
<select id="selectDetailPage" resultType="cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataInfoRespVO"> <select id="selectDetailPage" resultType="cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataInfoRespVO">
SELECT SELECT
a.id AS id,
a.factory_id AS factoryId,
a.package_name AS packageName,
a.package_date AS date,
a.size_id AS sizeId,
a.size_name AS sizeName,
a.size_pieces AS sizePieces,
a.num AS num,
a.auto_num AS autoNum,
a.square_num AS squareNum,
a.damage_num AS damageNum,
b.inNumId,
b.inNum,
b.inDamageNumId,
b.inDamageNum,
b.outNumId,
b.outNum,
b.outDamageNumId,
b.outDamageNum,
a.create_time AS createTime
FROM
sf_package_data a
LEFT JOIN (
SELECT
factory_id,
date,
size_pieces,
MAX( CASE WHEN type = 4 THEN id END ) AS inNumId,
MAX( CASE WHEN type = 4 THEN num END ) AS inNum,
MAX( CASE WHEN type = 1 THEN id END ) AS inDamageNumId,
MAX( CASE WHEN type = 1 THEN num END ) AS inDamageNum,
MAX( CASE WHEN type = 2 THEN id END ) AS outNumId,
MAX( CASE WHEN type = 2 THEN num END ) AS outNum,
MAX( CASE WHEN type = 3 THEN id END ) AS outDamageNumId,
MAX( CASE WHEN type = 3 THEN num END ) AS outDamageNum
FROM
sf_factory_data_size
GROUP BY
factory_id,
date,
size_pieces
) b
ON a.factory_id = b.factory_id
AND a.package_date = b.date
and a.size_pieces = b.size_pieces
<where>
a.deleted = 0
<if test="reqVO.factoryId != null">
AND a.factory_id = #{reqVO.factoryId}
</if>
<if test="reqVO.date != null and reqVO.date.length > 0">
<if test="reqVO.date[0] != null">
AND a.package_date &gt;= #{reqVO.date[0]}
</if>
<if test="reqVO.date[1] != null">
AND a.package_date &lt;= #{reqVO.date[1]}
</if>
</if>
<if test="reqVO.createTime != null and reqVO.createTime.length > 0">
<if test="reqVO.createTime[0] != null">
AND a.create_time &gt;= #{reqVO.createTime[0]}
</if>
<if test="reqVO.createTime[1] != null">
AND a.create_time &lt;= #{reqVO.createTime[1]}
</if>
</if>
</where>
UNION
SELECT
NULL AS id,
c.factory_id AS factoryId, c.factory_id AS factoryId,
NULL AS packageName,
c.date AS date, c.date AS date,
c.size_id AS sizeId, c.size_id AS sizeId,
c.size_name AS sizeName, c.size_name AS sizeName,
NULL AS sizePieces,
NULL AS num,
NULL AS autoNum,
NULL AS squareNum,
NULL AS damageNum,
MAX(CASE WHEN c.type = 4 THEN c.id END) AS inNumId, MAX(CASE WHEN c.type = 4 THEN c.id END) AS inNumId,
MAX(CASE WHEN c.type = 4 THEN c.num END) AS inNum, MAX(CASE WHEN c.type = 4 THEN c.num END) AS inNum,
MAX(CASE WHEN c.type = 4 THEN c.square_num END) AS squareNum,
MAX(CASE WHEN c.type = 1 THEN c.id END) AS inDamageNumId, MAX(CASE WHEN c.type = 1 THEN c.id END) AS inDamageNumId,
MAX(CASE WHEN c.type = 1 THEN c.num END) AS inDamageNum, MAX(CASE WHEN c.type = 1 THEN c.num END) AS inDamageNum,
MAX(CASE WHEN c.type = 2 THEN c.id END) AS outNumId, MAX(CASE WHEN c.type = 2 THEN c.id END) AS outNumId,
@ -105,15 +28,7 @@
FROM FROM
sf_factory_data_size AS c sf_factory_data_size AS c
WHERE WHERE
NOT EXISTS ( c.deleted = 0
SELECT 1
FROM sf_package_data
WHERE
size_id = c.size_id
AND size_pieces = c.size_pieces
AND package_date = c.date
)
AND c.deleted = 0
<if test="reqVO.factoryId != null"> <if test="reqVO.factoryId != null">
AND c.factory_id = #{reqVO.factoryId} AND c.factory_id = #{reqVO.factoryId}
</if> </if>
@ -133,8 +48,14 @@
AND c.create_time &lt;= #{reqVO.createTime[1]} AND c.create_time &lt;= #{reqVO.createTime[1]}
</if> </if>
</if> </if>
GROUP BY c.factory_id,c.date,c.size_id,c.size_name GROUP BY
ORDER BY date DESC c.factory_id,
c.date,
c.size_name
ORDER BY
c.date DESC,
c.factory_id,
c.size_name
</select> </select>
<select id="selectDataSum" resultType="cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataTotalVO"> <select id="selectDataSum" resultType="cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataTotalVO">

View File

@ -11,89 +11,13 @@
<select id="selectDetailList" resultType="cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataInfoRespVO"> <select id="selectDetailList" resultType="cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataInfoRespVO">
SELECT SELECT
a.id AS id,
a.factory_id AS factoryId,
a.package_name AS packageName,
a.package_date AS date,
a.size_id AS sizeId,
a.size_name AS sizeName,
a.size_pieces AS sizePieces,
a.num AS num,
a.auto_num AS autoNum,
a.square_num AS squareNum,
a.damage_num AS damageNum,
b.inNumId,
b.inNum,
b.inDamageNumId,
b.inDamageNum,
b.outNumId,
b.outNum,
b.outDamageNumId,
b.outDamageNum
FROM
sf_package_data a
LEFT JOIN (
SELECT
factory_id,
date,
size_pieces,
MAX( CASE WHEN type = 4 THEN id END ) AS inNumId,
MAX( CASE WHEN type = 4 THEN num END ) AS inNum,
MAX( CASE WHEN type = 1 THEN id END ) AS inDamageNumId,
MAX( CASE WHEN type = 1 THEN num END ) AS inDamageNum,
MAX( CASE WHEN type = 2 THEN id END ) AS outNumId,
MAX( CASE WHEN type = 2 THEN num END ) AS outNum,
MAX( CASE WHEN type = 3 THEN id END ) AS outDamageNumId,
MAX( CASE WHEN type = 3 THEN num END ) AS outDamageNum
FROM
sf_factory_data_size
GROUP BY
factory_id,
date,
size_pieces
) b
ON a.factory_id = b.factory_id
AND a.package_date = b.date
and a.size_pieces = b.size_pieces
<where>
a.deleted = 0
<if test="factoryId != null">
AND a.factory_id = #{factoryId}
</if>
<if test="date != null and date.length > 0">
<if test="date[0] != null">
AND a.package_date &gt;= #{date[0]}
</if>
<if test="date[1] != null">
AND a.package_date &lt;= #{date[1]}
</if>
</if>
<if test="dateTime != null and dateTime.length > 0">
<if test="dateTime[0] != null">
AND a.create_time &gt;= #{dateTime[0]}
</if>
<if test="dateTime[1] != null">
AND a.create_time &lt;= #{dateTime[1]}
</if>
</if>
</where>
UNION
SELECT
NULL AS id,
c.factory_id AS factoryId, c.factory_id AS factoryId,
NULL AS packageName,
c.date AS date, c.date AS date,
c.size_id AS sizeId, c.size_id AS sizeId,
c.size_name AS sizeName, c.size_name AS sizeName,
NULL AS sizePieces,
NULL AS num,
NULL AS autoNum,
NULL AS squareNum,
NULL AS damageNum,
MAX(CASE WHEN c.type = 4 THEN c.id END) AS inNumId, MAX(CASE WHEN c.type = 4 THEN c.id END) AS inNumId,
MAX(CASE WHEN c.type = 4 THEN c.num END) AS inNum, MAX(CASE WHEN c.type = 4 THEN c.num END) AS inNum,
MAX(CASE WHEN c.type = 4 THEN c.square_num END) AS squareNum,
MAX(CASE WHEN c.type = 1 THEN c.id END) AS inDamageNumId, MAX(CASE WHEN c.type = 1 THEN c.id END) AS inDamageNumId,
MAX(CASE WHEN c.type = 1 THEN c.num END) AS inDamageNum, MAX(CASE WHEN c.type = 1 THEN c.num END) AS inDamageNum,
MAX(CASE WHEN c.type = 2 THEN c.id END) AS outNumId, MAX(CASE WHEN c.type = 2 THEN c.id END) AS outNumId,
@ -101,17 +25,9 @@
MAX(CASE WHEN c.type = 3 THEN c.id END) AS outDamageNumId, MAX(CASE WHEN c.type = 3 THEN c.id END) AS outDamageNumId,
MAX(CASE WHEN c.type = 3 THEN c.num END) AS outDamageNum MAX(CASE WHEN c.type = 3 THEN c.num END) AS outDamageNum
FROM FROM
sf_factory_data_size AS c sf_factory_data_size c
WHERE WHERE
NOT EXISTS ( c.deleted = 0
SELECT 1
FROM sf_package_data
WHERE
size_id = c.size_id
AND size_pieces = c.size_pieces
AND package_date = c.date
)
AND c.deleted = 0
<if test="factoryId != null"> <if test="factoryId != null">
AND c.factory_id = #{factoryId} AND c.factory_id = #{factoryId}
</if> </if>
@ -131,8 +47,14 @@
AND c.create_time &lt;= #{dateTime[1]} AND c.create_time &lt;= #{dateTime[1]}
</if> </if>
</if> </if>
GROUP BY c.factory_id,c.date,c.size_id,c.size_name GROUP BY
ORDER BY date DESC c.factory_id,
c.date,
c.size_name
ORDER BY
c.date DESC,
c.factory_id,
c.size_name
</select> </select>
<select id="selectSUMByDateTimes" resultType="cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataInfoRespVO"> <select id="selectSUMByDateTimes" resultType="cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataInfoRespVO">
@ -152,4 +74,21 @@
factory_id, factory_id,
date date
</select> </select>
<select id="selectLastSize" resultType="cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorydata.FactoryDataSizeDO">
SELECT DISTINCT
a.size_id AS sizeId,
a.size_name AS sizeName
FROM
sf_factory_data_size a,
( SELECT MAX( date ) AS d FROM sf_factory_data_size ) b
WHERE
a.date = b.d
AND a.deleted = 0
AND a.factory_id = #{ factoryId }
AND a.type IN
<foreach collection="types" item="types" open="(" close=")" separator=",">
#{types}
</foreach>
</select>
</mapper> </mapper>