出入库数据修改, 追加出入库导入功能
This commit is contained in:
parent
ddd22df271
commit
0e8b4696f3
@ -2,6 +2,7 @@ package cn.iocoder.yudao.framework.excel.core.util;
|
||||
|
||||
import com.alibaba.excel.EasyExcel;
|
||||
import com.alibaba.excel.converters.longconverter.LongStringConverter;
|
||||
import com.alibaba.excel.support.ExcelTypeEnum;
|
||||
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
@ -37,7 +38,9 @@ public class ExcelUtils {
|
||||
.autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理
|
||||
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 基于 column 长度,自动适配。最大 255 宽度
|
||||
.registerConverter(new LongStringConverter()) // 避免 Long 类型丢失精度
|
||||
.sheet(sheetName).doWrite(data);
|
||||
.excelType(ExcelTypeEnum.XLSX)
|
||||
.sheet(sheetName)
|
||||
.doWrite(data);
|
||||
|
||||
// 设置 header 和 contentType。写在最后的原因是,避免报错时,响应 contentType 已经被修改了
|
||||
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, StandardCharsets.UTF_8.name()));
|
||||
@ -45,13 +48,15 @@ public class ExcelUtils {
|
||||
}
|
||||
|
||||
public static <T> void write(HttpServletResponse response, String filename, String sheetName,
|
||||
Class<T> head, List<T> data, List<String> deptName, List<String> postName) throws IOException {
|
||||
Class<T> head, List<T> data,
|
||||
int col, List<String> value,
|
||||
int col1,List<String> value1) throws IOException {
|
||||
|
||||
// 输出excel
|
||||
EasyExcel.write(response.getOutputStream(), head)
|
||||
.autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理
|
||||
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 基于 column 长度,自动适配。最大 255 宽度
|
||||
.registerWriteHandler(new SpinnerWriteHandler(deptName, postName))
|
||||
.registerWriteHandler(new SpinnerWriteHandler(col, value, col1, value1))
|
||||
.registerConverter(new LongStringConverter()) // 避免 Long 类型丢失精度
|
||||
.sheet(sheetName).doWrite(data);
|
||||
|
||||
|
@ -16,6 +16,10 @@ import java.util.Map;
|
||||
|
||||
public class SpinnerWriteHandler implements SheetWriteHandler {
|
||||
|
||||
private int col;
|
||||
|
||||
private int col1;
|
||||
|
||||
private List<String> deptName;
|
||||
|
||||
private List<String> postName;
|
||||
@ -23,8 +27,11 @@ public class SpinnerWriteHandler implements SheetWriteHandler {
|
||||
public SpinnerWriteHandler() {
|
||||
}
|
||||
|
||||
public SpinnerWriteHandler(List<String> deptName, List<String> postName) {
|
||||
public SpinnerWriteHandler(int col, List<String> deptName,
|
||||
int col1, List<String> postName) {
|
||||
|
||||
this.col = col;
|
||||
this.col1 = col1;
|
||||
this.deptName = deptName;
|
||||
this.postName = postName;
|
||||
}
|
||||
@ -35,8 +42,8 @@ public class SpinnerWriteHandler implements SheetWriteHandler {
|
||||
|
||||
Map<Integer, String[]> mapDropDown = new HashMap<>();
|
||||
// 这里的key值 对应导出列的顺序 从0开始
|
||||
mapDropDown.put(1, deptName.toArray(new String[0]));
|
||||
mapDropDown.put(2, postName.toArray(new String[0]));
|
||||
mapDropDown.put(col, deptName.toArray(new String[0]));
|
||||
mapDropDown.put(col1, postName.toArray(new String[0]));
|
||||
Sheet sheet = writeSheetHolder.getSheet();
|
||||
/// 开始设置下拉框
|
||||
DataValidationHelper helper = sheet.getDataValidationHelper();// 设置下拉框
|
||||
|
@ -24,4 +24,6 @@ public interface ErrorCodeConstants {
|
||||
//出入库数据模块
|
||||
ErrorCode SIZEDATA_NOT_EXISTS = new ErrorCode(1_000_002_001, "不能操作非当天录入得数据");
|
||||
|
||||
ErrorCode FACTORY_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_000_002_002, "导入出入库数据不能为空!");
|
||||
|
||||
}
|
||||
|
@ -1,3 +0,0 @@
|
||||
// TODO 待办:请将下面的错误码复制到 yudao-module-smartfactory-api 模块的 ErrorCodeConstants 类中。注意,请给“TODO 补充编号”设置一个错误码编号!!!
|
||||
// ========== 工厂信息 TODO 补充编号 ==========
|
||||
ErrorCode FACTORY_INFO_NOT_EXISTS = new ErrorCode(TODO 补充编号, "工厂信息不存在");
|
@ -3,27 +3,33 @@ package cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata;
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataDetailRespVO;
|
||||
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.*;
|
||||
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.dal.dataobject.factoryinfo.FactoryInfoDO;
|
||||
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.FactoryDataSizeService;
|
||||
import cn.iocoder.yudao.module.smartfactory.service.factoryinfo.FactoryInfoService;
|
||||
import cn.iocoder.yudao.module.smartfactory.service.size.SizeService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.validation.Valid;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
|
||||
@ -40,6 +46,12 @@ public class FactoryDataController {
|
||||
@Resource
|
||||
private FactoryDataSizeService factoryDataSizeService;
|
||||
|
||||
@Resource
|
||||
private FactoryInfoService factoryInfoService;
|
||||
|
||||
@Resource
|
||||
private SizeService sizeService;
|
||||
|
||||
@PostMapping("/create-size")
|
||||
@Operation(summary = "创建工厂出库入库规格数据")
|
||||
@PreAuthorize("@ss.hasPermission('smartfactory:factory-data:create')")
|
||||
@ -110,8 +122,51 @@ public class FactoryDataController {
|
||||
HttpServletResponse response) throws IOException {
|
||||
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
||||
List<FactoryDataDetailRespVO> list = dataService.getDataPage(pageReqVO).getList();
|
||||
List<FactoryDataExportVO> exportVOS = new ArrayList<>();
|
||||
for (FactoryDataDetailRespVO respVO : list) {
|
||||
|
||||
exportVOS.addAll(
|
||||
respVO.getItems().stream().map(info -> {
|
||||
FactoryDataExportVO exportVO = BeanUtils.toBean(info, FactoryDataExportVO.class);
|
||||
exportVO.setFactoryName(respVO.getFactoryName());
|
||||
exportVO.setDate(respVO.getDate());
|
||||
exportVO.setInTotalNum(respVO.getInTotalNum());
|
||||
exportVO.setOutTotalNum(respVO.getOutTotalNum());
|
||||
exportVO.setDamageTotalNum(respVO.getDamageNum());
|
||||
return exportVO;
|
||||
}).collect(Collectors.toList()));
|
||||
}
|
||||
// 导出 Excel
|
||||
ExcelUtils.write(response, "工厂出库入库数据.xls", "数据", FactoryDataDetailRespVO.class,
|
||||
list);
|
||||
ExcelUtils.write(response, "工厂出库入库数据.xlsx", "数据", FactoryDataExportVO.class, exportVOS);
|
||||
}
|
||||
|
||||
@GetMapping("/get-import-template")
|
||||
@Operation(summary = "获得导入模板")
|
||||
public void importTemplate(HttpServletResponse response) throws IOException {
|
||||
|
||||
// 获取工厂信息
|
||||
List<FactoryInfoDO> factoryInfoDOS = factoryInfoService.getFactoryListByType();
|
||||
List<String> factory = factoryInfoDOS.stream().map(info -> info.getId() + ":" + info.getShortName()).collect(Collectors.toList());
|
||||
|
||||
// 获取规格信息
|
||||
List<SizeDO> sizeDOS = sizeService.getListSize();
|
||||
List<String> size = sizeDOS.stream().map(info -> info.getId() + ":" + info.getName()).collect(Collectors.toList());
|
||||
|
||||
// 输出
|
||||
ExcelUtils.write(response, "出入库数据导入模板.xlsx", "详情",
|
||||
FactoryDataExportVO.class, null,
|
||||
0, factory,
|
||||
2, size);
|
||||
}
|
||||
|
||||
@PostMapping("/import")
|
||||
@Operation(summary = "导入出入库数据")
|
||||
@Parameter(name = "file", description = "Excel 文件", required = true)
|
||||
@PreAuthorize("@ss.hasPermission('smartfactory:factory-data:import')")
|
||||
public CommonResult<FactoryImportRespVO> importExcel(@RequestParam("file") MultipartFile file) throws Exception {
|
||||
|
||||
List<FactoryDataImportVO> list = ExcelUtils.read(file, FactoryDataImportVO.class);
|
||||
|
||||
return success(dataService.importUserList(list));
|
||||
}
|
||||
}
|
@ -20,6 +20,11 @@ public class FactoryDataDetailRespVO {
|
||||
@Schema(description = "日期", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-05-14")
|
||||
private LocalDate date;
|
||||
|
||||
/**
|
||||
* 规格明细
|
||||
*/
|
||||
private List<FactoryDataInfoRespVO> items;
|
||||
|
||||
@Schema(description = "入库总箱数")
|
||||
private Integer inTotalNum;
|
||||
|
||||
@ -34,9 +39,4 @@ public class FactoryDataDetailRespVO {
|
||||
|
||||
@Schema(description = "是否可编辑 | 1可 ")
|
||||
private Integer isEdit;
|
||||
|
||||
/**
|
||||
* 规格明细
|
||||
*/
|
||||
private List<FactoryDataInfoRespVO> items;
|
||||
}
|
||||
|
@ -0,0 +1,51 @@
|
||||
package cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
|
||||
@Schema(description = "出入库数据导出excel VO")
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
public class FactoryDataExportVO {
|
||||
|
||||
@ExcelProperty("工厂名称")
|
||||
private String factoryName;
|
||||
|
||||
@ExcelProperty("日期")
|
||||
private LocalDate date;
|
||||
|
||||
@ExcelProperty("规格")
|
||||
private String sizeName;
|
||||
|
||||
@ExcelProperty("入库数")
|
||||
private Integer inNum;
|
||||
|
||||
@ExcelProperty("入库平方数")
|
||||
private BigDecimal squareNum;
|
||||
|
||||
@ExcelProperty("打包破损数")
|
||||
private Integer damageNum;
|
||||
|
||||
@ExcelProperty("入库破损数")
|
||||
private Integer inDamageNum;
|
||||
|
||||
@ExcelProperty("出库数")
|
||||
private Integer outNum;
|
||||
|
||||
@ExcelProperty("出库破损数")
|
||||
private Integer outDamageNum;
|
||||
|
||||
@ExcelProperty("入库总数")
|
||||
private Integer inTotalNum;
|
||||
|
||||
@ExcelProperty("出库总数")
|
||||
private Integer outTotalNum;
|
||||
|
||||
@ExcelProperty("破损总数")
|
||||
private Integer damageTotalNum;
|
||||
}
|
@ -0,0 +1,51 @@
|
||||
package cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
/**
|
||||
* 出入库数据导入 VO
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@Accessors(chain = false) // 设置 chain = false,避免用户导入有问题
|
||||
public class FactoryDataImportVO {
|
||||
|
||||
@ExcelProperty("工厂名称")
|
||||
private String factoryName;
|
||||
|
||||
@ExcelProperty("日期")
|
||||
private LocalDate date;
|
||||
|
||||
@ExcelProperty("规格")
|
||||
private String sizeName;
|
||||
|
||||
@ExcelProperty("手动打包数")
|
||||
private Integer num;
|
||||
|
||||
@ExcelProperty("自动打包数")
|
||||
private Integer autoNum;
|
||||
|
||||
@ExcelProperty("入库数")
|
||||
private Integer inNum;
|
||||
|
||||
@ExcelProperty("打包破损数")
|
||||
private Integer damageNum;
|
||||
|
||||
@ExcelProperty("入库破损数")
|
||||
private Integer inDamageNum;
|
||||
|
||||
@ExcelProperty("出库数")
|
||||
private Integer outNum;
|
||||
|
||||
@ExcelProperty("出库破损数")
|
||||
private Integer outDamageNum;
|
||||
}
|
@ -37,6 +37,9 @@ public class FactoryDataInfoRespVO {
|
||||
@Schema(description = "自动打包数")
|
||||
private Integer autoNum;
|
||||
|
||||
@Schema(description = "入库数量Id")
|
||||
private Long inNumId;
|
||||
|
||||
@Schema(description = "入库数量")
|
||||
private Integer inNum;
|
||||
|
||||
|
@ -0,0 +1,23 @@
|
||||
package cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Schema(description = "管理后台 - 出入库数据导入 Response VO")
|
||||
@Data
|
||||
@Builder
|
||||
public class FactoryImportRespVO {
|
||||
|
||||
@Schema(description = "创建成功的用户名数组", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private List<String> createUsernames;
|
||||
|
||||
@Schema(description = "更新成功的用户名数组", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private List<String> updateUsernames;
|
||||
|
||||
@Schema(description = "导入失败的用户集合,key 为用户名,value 为失败原因", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private Map<String, String> failureUsernames;
|
||||
}
|
@ -50,6 +50,12 @@ public class FactoryDataSizeDetailRespVO {
|
||||
@Schema(description = "自动打包数")
|
||||
private Integer autoNum;
|
||||
|
||||
@Schema(description = "入库数Id")
|
||||
private Long inNumId;
|
||||
|
||||
@Schema(description = "入库数")
|
||||
private Integer inNum;
|
||||
|
||||
@Schema(description = "打包破损数")
|
||||
private Integer damageNum;
|
||||
|
||||
@ -58,6 +64,9 @@ public class FactoryDataSizeDetailRespVO {
|
||||
|
||||
@Schema(description = "入库破损数")
|
||||
private Integer inDamageNum;
|
||||
|
||||
@Schema(description = "是否可编辑 | 0否 1是")
|
||||
private Integer isEnable = 0;
|
||||
}
|
||||
|
||||
@Data
|
||||
|
@ -21,6 +21,12 @@ public class FactoryDataSizeSaveReqVO {
|
||||
@NotNull(message = "规格片数不能为空")
|
||||
private Integer sizePieces;
|
||||
|
||||
@Schema(description = "入库数量Id")
|
||||
private Long inNumId;
|
||||
|
||||
@Schema(description = "入库数量")
|
||||
private Integer inNum;
|
||||
|
||||
@Schema(description = "入库破损数量Id")
|
||||
private Long inDamageNumId;
|
||||
|
||||
|
@ -79,6 +79,15 @@ public class FactoryInfoController {
|
||||
return success(BeanUtils.toBean(factoryInfo, FactorySimpleRespVO.class));
|
||||
}
|
||||
|
||||
@GetMapping("/simple-list-authority")
|
||||
@Operation(summary = "获得工厂列表(权限检验) | 用于前端下拉框")
|
||||
@PreAuthorize("@ss.hasPermission('smartfactory:factory-info:query')")
|
||||
public CommonResult<List<FactorySimpleRespVO>> getFactoryListByAuthority() {
|
||||
|
||||
List<FactoryInfoDO> factoryInfo = factoryInfoService.getFactoryListByAuthority();
|
||||
return success(BeanUtils.toBean(factoryInfo, FactorySimpleRespVO.class));
|
||||
}
|
||||
|
||||
@GetMapping("/page")
|
||||
@Operation(summary = "获得工厂信息分页")
|
||||
@PreAuthorize("@ss.hasPermission('smartfactory:factory-info:query')")
|
||||
|
@ -20,7 +20,9 @@ import java.util.List;
|
||||
@Mapper
|
||||
public interface FactoryDataSizeMapper extends BaseMapperX<FactoryDataSizeDO> {
|
||||
|
||||
List<FactoryDataInfoRespVO> selectDetailList(@Param("factoryId") Long factoryId, @Param("date") LocalDate[] date);
|
||||
List<FactoryDataInfoRespVO> selectDetailList(@Param("factoryId") Long factoryId,
|
||||
@Param("date") LocalDate[] date,
|
||||
@Param("dateTime") LocalDateTime[] createTime);
|
||||
|
||||
default void deleteByFactoryId(Long factoryId, String date) {
|
||||
|
||||
|
@ -29,11 +29,11 @@ public interface FactoryInfoMapper extends BaseMapperX<FactoryInfoDO> {
|
||||
.orderByAsc(FactoryInfoDO::getSort));
|
||||
}
|
||||
|
||||
default List<FactoryInfoDO> selectListByType(Long factoryId) {
|
||||
default List<FactoryInfoDO> selectListByType(List<Long> factoryId) {
|
||||
|
||||
return selectList(new LambdaQueryWrapperX<FactoryInfoDO>()
|
||||
.eq(FactoryInfoDO::getType, 3)
|
||||
.eqIfPresent(FactoryInfoDO::getId, factoryId));
|
||||
.inIfPresent(FactoryInfoDO::getId, factoryId));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -71,6 +71,12 @@ public class FactoryDataJob {
|
||||
data.setDamageNum(data.getDamageNum() + infos.get(0).getInDamageNum());
|
||||
}
|
||||
|
||||
if (infos.get(0).getInNum() != null) {
|
||||
|
||||
// 设置 入库总数数
|
||||
data.setTotalNum(data.getTotalNum() + infos.get(0).getInNum());
|
||||
}
|
||||
|
||||
// 如果存在出库数时
|
||||
if (infos.get(0).getOutNum() != null) {
|
||||
|
||||
|
@ -1,9 +1,7 @@
|
||||
package cn.iocoder.yudao.module.smartfactory.service.factorydata;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataDetailRespVO;
|
||||
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.*;
|
||||
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.dal.dataobject.factorydata.FactoryDataDO;
|
||||
@ -92,4 +90,11 @@ public interface FactoryDataService {
|
||||
* @return 出入库数据
|
||||
*/
|
||||
FactoryDataDO getListByType(Long factoryId, LocalDate date, Integer type);
|
||||
|
||||
/**
|
||||
* 导入出入库数据
|
||||
* @param list 数据
|
||||
* @return 结果
|
||||
*/
|
||||
FactoryImportRespVO importUserList(List<FactoryDataImportVO> list);
|
||||
}
|
@ -1,25 +1,28 @@
|
||||
package cn.iocoder.yudao.module.smartfactory.service.factorydata;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.iocoder.yudao.framework.common.exception.ServiceException;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataDetailRespVO;
|
||||
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.FactoryDataTotalVO;
|
||||
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.FactoryDataSizeDetailRespVO;
|
||||
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.convert.packageData.PackageDataConvert;
|
||||
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.factoryinfo.FactoryInfoDO;
|
||||
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.packageInfo.PackageDO;
|
||||
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.FactoryDataSizeMapper;
|
||||
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.packagedata.PackageDataService;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
@ -34,7 +37,9 @@ import java.time.format.DateTimeFormatter;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
|
||||
import static cn.iocoder.yudao.module.smartfactory.enums.ErrorCodeConstants.*;
|
||||
|
||||
|
||||
/**
|
||||
@ -59,6 +64,12 @@ public class FactoryDataServiceImpl implements FactoryDataService {
|
||||
@Resource
|
||||
private PackageDataService packageDataService;
|
||||
|
||||
@Resource
|
||||
private FactoryDataSizeMapper factoryDataSizeMapper;
|
||||
|
||||
@Resource
|
||||
private PackageService packageService;
|
||||
|
||||
@Override
|
||||
public Long createData(List<FactoryDataDO> factoryDataDOS) {
|
||||
|
||||
@ -131,13 +142,23 @@ public class FactoryDataServiceImpl implements FactoryDataService {
|
||||
respVO.setDate(LocalDate.parse(date));
|
||||
|
||||
//获得 规则明细数据
|
||||
List<FactoryDataInfoRespVO> infoRespVOS = dataSizeService.getDetailList(factoryId, new LocalDate[]{LocalDate.parse(date), LocalDate.parse(date)});
|
||||
List<FactoryDataInfoRespVO> infoRespVOS = dataSizeService.getDetailList(factoryId, new LocalDate[]{LocalDate.parse(date), LocalDate.parse(date)}, null);
|
||||
|
||||
respVO.setInItems(
|
||||
infoRespVOS.stream()
|
||||
.filter(info -> info.getInNum() != null || info.getInDamageNum() != null)
|
||||
.map(info -> BeanUtil.toBean(info, FactoryDataSizeDetailRespVO.InItem.class))
|
||||
.collect(Collectors.toList()));
|
||||
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()
|
||||
.filter(info -> info.getInNum() != null)
|
||||
.map(info -> {
|
||||
FactoryDataSizeDetailRespVO.InItem inItem = BeanUtil.toBean(info, FactoryDataSizeDetailRespVO.InItem.class);
|
||||
inItem.setIsEnable(1);
|
||||
return inItem;
|
||||
})
|
||||
.collect(Collectors.toList());
|
||||
inItems.addAll(packageInfo);
|
||||
respVO.setInItems(inItems);
|
||||
|
||||
respVO.setOutItems(
|
||||
infoRespVOS.stream()
|
||||
@ -156,6 +177,9 @@ public class FactoryDataServiceImpl implements FactoryDataService {
|
||||
IPage<FactoryDataDetailRespVO> page = dataMapper.selectDetailPage(mpPage, pageReqVO);
|
||||
PageResult<FactoryDataDetailRespVO> dataPage = new PageResult<>(page.getRecords(), page.getTotal());
|
||||
|
||||
//获得 入库数、打包破损、入库破损、出库数、出库破损的工厂规格数据
|
||||
List<FactoryDataInfoRespVO> infoDatas = dataSizeService.getDetailList(pageReqVO.getFactoryId(), pageReqVO.getDate(), pageReqVO.getCreateTime());
|
||||
|
||||
List<FactoryDataDetailRespVO> respVOS = dataPage.getList();
|
||||
if (!respVOS.isEmpty()) {
|
||||
|
||||
@ -164,15 +188,18 @@ public class FactoryDataServiceImpl implements FactoryDataService {
|
||||
List<FactoryInfoDO> factoryInfoDOS = factoryInfoService.getFactoryList(factoryIdS);
|
||||
Map<Long, FactoryInfoDO> factoryMap = convertMap(factoryInfoDOS, FactoryInfoDO::getId);
|
||||
|
||||
//获得 入库数、打包破损、入库破损、出库数、出库破损的工厂规格数据
|
||||
List<FactoryDataInfoRespVO> infoDatas = dataSizeService.getDetailList(pageReqVO.getFactoryId(), pageReqVO.getDate());
|
||||
|
||||
respVOS.forEach(items -> {
|
||||
|
||||
//规格明细数据
|
||||
List<FactoryDataInfoRespVO> infoList = infoDatas.stream()
|
||||
.filter(data -> data.getFactoryId().equals(items.getFactoryId()) && data.getDate().equals(items.getDate()))
|
||||
.collect(Collectors.toList());
|
||||
infoList.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));
|
||||
});
|
||||
|
||||
items.setItems(infoList);
|
||||
items.setFactoryName(factoryMap.get(items.getFactoryId()).getName());
|
||||
@ -180,53 +207,79 @@ public class FactoryDataServiceImpl implements FactoryDataService {
|
||||
//移除 已处理过的数据
|
||||
infoDatas.removeAll(infoList);
|
||||
});
|
||||
|
||||
// 展示当天录入的数据
|
||||
if (!infoDatas.isEmpty()) {
|
||||
|
||||
// 按 工厂id和日期 进行分组
|
||||
Map<Long, Map<LocalDate, List<FactoryDataInfoRespVO>>> groupedByFactoryIdAndDate = infoDatas.stream()
|
||||
.collect(Collectors.groupingBy(FactoryDataInfoRespVO::getFactoryId,
|
||||
Collectors.groupingBy(FactoryDataInfoRespVO::getDate)));
|
||||
|
||||
groupedByFactoryIdAndDate.forEach((factoryId, dateMap) -> {
|
||||
|
||||
//按日期倒叙 并遍历
|
||||
dateMap.entrySet().stream().sorted(Map.Entry.comparingByKey())
|
||||
.forEach((date) -> {
|
||||
|
||||
FactoryDataDetailRespVO dataDetailRespVO = new FactoryDataDetailRespVO();
|
||||
|
||||
dataDetailRespVO.setFactoryId(factoryId);
|
||||
dataDetailRespVO.setFactoryName(factoryMap.get(factoryId).getName());
|
||||
dataDetailRespVO.setDate(date.getKey());
|
||||
//设置入库总数
|
||||
dataDetailRespVO.setInTotalNum(date.getValue().stream().filter(info -> info.getInNum() != null).mapToInt(FactoryDataInfoRespVO::getInNum).sum());
|
||||
//设置入库平方数
|
||||
dataDetailRespVO.setSquareNum(date.getValue().stream().map(FactoryDataInfoRespVO::getSquareNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
|
||||
//设置出库总数
|
||||
dataDetailRespVO.setOutTotalNum(infoDatas.stream().filter(info -> info.getOutNum() != null).mapToInt(FactoryDataInfoRespVO::getOutNum).sum());
|
||||
//设置 出入库破损总数
|
||||
Integer sum = infoDatas.stream().map(info -> {
|
||||
FactoryDataInfoRespVO respVO = BeanUtils.toBean(info, FactoryDataInfoRespVO.class);
|
||||
respVO.setInDamageNum(Optional.ofNullable(info.getInDamageNum()).orElse(0));
|
||||
respVO.setOutDamageNum(Optional.ofNullable(info.getOutDamageNum()).orElse(0));
|
||||
return respVO;
|
||||
}).mapToInt(info -> info.getInDamageNum() + info.getOutDamageNum()).sum();
|
||||
|
||||
dataDetailRespVO.setDamageNum(sum == 0 ? null : sum);
|
||||
dataDetailRespVO.setItems(date.getValue());
|
||||
//设置 可编辑状态
|
||||
dataDetailRespVO.setIsEdit(1);
|
||||
|
||||
respVOS.add(0, dataDetailRespVO);
|
||||
});
|
||||
});
|
||||
dataPage.setTotal((long) respVOS.size());
|
||||
}
|
||||
}else {
|
||||
respVOS = new ArrayList<>();
|
||||
}
|
||||
|
||||
return dataPage;
|
||||
List<FactoryDataDetailRespVO> toDayData = new ArrayList<>();
|
||||
// 展示当天录入的数据
|
||||
if (!infoDatas.isEmpty()) {
|
||||
|
||||
// 按 工厂id和日期 进行分组
|
||||
Map<Long, Map<LocalDate, List<FactoryDataInfoRespVO>>> groupedByFactoryIdAndDate = infoDatas.stream()
|
||||
.collect(Collectors.groupingBy(FactoryDataInfoRespVO::getFactoryId,
|
||||
Collectors.groupingBy(FactoryDataInfoRespVO::getDate)));
|
||||
|
||||
Map<Long, FactoryInfoDO> factoryMaps = convertMap(factoryInfoService.getFactoryList(groupedByFactoryIdAndDate.keySet())
|
||||
, FactoryInfoDO::getId);
|
||||
groupedByFactoryIdAndDate.forEach((factoryId, dateMap) -> {
|
||||
|
||||
//按日期倒叙 并遍历
|
||||
dateMap.entrySet().stream().sorted(Map.Entry.comparingByKey()).forEach((date) -> {
|
||||
|
||||
FactoryDataDetailRespVO dataDetailRespVO = new FactoryDataDetailRespVO();
|
||||
|
||||
dataDetailRespVO.setFactoryId(factoryId);
|
||||
dataDetailRespVO.setFactoryName(factoryMaps.get(factoryId).getName());
|
||||
dataDetailRespVO.setDate(date.getKey());
|
||||
//设置入库总数
|
||||
int inSum = date.getValue().stream()
|
||||
.map(info -> {
|
||||
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();
|
||||
dataDetailRespVO.setInTotalNum(inSum == 0 ? null : inSum);
|
||||
|
||||
//设置入库平方数
|
||||
dataDetailRespVO.setSquareNum(date.getValue().stream().map(FactoryDataInfoRespVO::getSquareNum)
|
||||
.filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
|
||||
|
||||
//设置出库总数
|
||||
int outTotalNum = date.getValue().stream().filter(info -> info.getOutNum() != null)
|
||||
.mapToInt(FactoryDataInfoRespVO::getOutNum).sum();
|
||||
dataDetailRespVO.setOutTotalNum(outTotalNum == 0 ? null : outTotalNum);
|
||||
|
||||
//设置 出入库破损总数
|
||||
int sum = date.getValue().stream().map(info -> {
|
||||
FactoryDataInfoRespVO respVO = BeanUtils.toBean(info, FactoryDataInfoRespVO.class);
|
||||
respVO.setInDamageNum(Optional.ofNullable(info.getInDamageNum()).orElse(0));
|
||||
respVO.setOutDamageNum(Optional.ofNullable(info.getOutDamageNum()).orElse(0));
|
||||
return respVO;
|
||||
}).mapToInt(info -> info.getInDamageNum() + info.getOutDamageNum()).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.setIsEdit(1);
|
||||
|
||||
toDayData.add(dataDetailRespVO);
|
||||
});
|
||||
});
|
||||
respVOS.addAll(0, toDayData);
|
||||
dataPage.setTotal((long) respVOS.size());
|
||||
}
|
||||
|
||||
return new PageResult<>(respVOS, dataPage.getTotal());
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -258,4 +311,155 @@ public class FactoryDataServiceImpl implements FactoryDataService {
|
||||
|
||||
return dataMapper.selectListByType(factoryId, date, type);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class) // 添加事务,异常则回滚所有导入
|
||||
public FactoryImportRespVO importUserList(List<FactoryDataImportVO> list) {
|
||||
|
||||
if (CollUtil.isEmpty(list)) {
|
||||
throw exception(FACTORY_IMPORT_LIST_IS_EMPTY);
|
||||
}
|
||||
|
||||
FactoryImportRespVO respVO = FactoryImportRespVO.builder().createUsernames(new ArrayList<>()).updateUsernames(new ArrayList<>()).failureUsernames(new LinkedHashMap<>()).build();
|
||||
list.forEach(data -> {
|
||||
|
||||
//校验,判断是否有不符合的原因
|
||||
try {
|
||||
validateFactoryForCreate(data.getFactoryName(), data.getSizeName(), data.getDate());
|
||||
} catch (ServiceException ex) {
|
||||
|
||||
respVO.getFailureUsernames().put(data.getFactoryName(), ex.getMessage());
|
||||
return;
|
||||
}
|
||||
|
||||
// 获取 工厂ID
|
||||
Long factoryId = Long.valueOf(data.getFactoryName().split(":")[0]);
|
||||
// 获取 规格ID
|
||||
Long sizeId = Long.valueOf(data.getSizeName().split(":")[0]);
|
||||
// 获取 规格名称
|
||||
String sizeName = data.getSizeName().split(":")[1];
|
||||
|
||||
PackageDO packageDO = packageService.getPackageByFactoryIdAndSize(factoryId, sizeId);
|
||||
if (data.getNum() != null || data.getAutoNum() != null) {
|
||||
|
||||
PackageDataDO packageDataDO = BeanUtils.toBean(packageDO, PackageDataDO.class);
|
||||
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());
|
||||
|
||||
//计算平方数
|
||||
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<>();
|
||||
if (data.getInDamageNum() != null || data.getInNum() != null || data.getOutNum() != null) {
|
||||
|
||||
if (data.getInDamageNum() != null) {
|
||||
|
||||
FactoryDataSizeDO dataSizeDO = new FactoryDataSizeDO();
|
||||
//设置规格信息
|
||||
dataSizeDO.setId(sizeId);
|
||||
dataSizeDO.setSizeName(sizeName);
|
||||
dataSizeDO.setSizePieces(packageDO == null ? null : packageDO.getSizePieces());
|
||||
//设置工厂和日期
|
||||
dataSizeDO.setFactoryId(factoryId);
|
||||
dataSizeDO.setDate(data.getDate());
|
||||
//设置入库破损数
|
||||
dataSizeDO.setType(1);
|
||||
dataSizeDO.setNum(data.getInDamageNum());
|
||||
|
||||
factoryDataSizeDOs.add(dataSizeDO);
|
||||
}
|
||||
|
||||
if (data.getInNum() != null) {
|
||||
|
||||
FactoryDataSizeDO dataSizeDO = new FactoryDataSizeDO();
|
||||
//设置规格信息
|
||||
dataSizeDO.setId(sizeId);
|
||||
dataSizeDO.setSizeName(sizeName);
|
||||
dataSizeDO.setSizePieces(packageDO == null ? null : packageDO.getSizePieces());
|
||||
//设置工厂和日期
|
||||
dataSizeDO.setFactoryId(factoryId);
|
||||
dataSizeDO.setDate(data.getDate());
|
||||
//设置入库破损数
|
||||
dataSizeDO.setType(4);
|
||||
dataSizeDO.setNum(data.getInNum());
|
||||
|
||||
factoryDataSizeDOs.add(dataSizeDO);
|
||||
}
|
||||
|
||||
if (data.getOutNum() != null) {
|
||||
|
||||
FactoryDataSizeDO dataSizeDO = new FactoryDataSizeDO();
|
||||
//设置规格信息
|
||||
dataSizeDO.setId(sizeId);
|
||||
dataSizeDO.setSizeName(sizeName);
|
||||
//设置工厂和日期
|
||||
dataSizeDO.setFactoryId(factoryId);
|
||||
dataSizeDO.setDate(data.getDate());
|
||||
//设置入库破损数
|
||||
dataSizeDO.setType(2);
|
||||
dataSizeDO.setNum(data.getOutNum());
|
||||
|
||||
factoryDataSizeDOs.add(dataSizeDO);
|
||||
}
|
||||
|
||||
if (data.getOutDamageNum() != null) {
|
||||
|
||||
FactoryDataSizeDO dataSizeDO = new FactoryDataSizeDO();
|
||||
//设置规格信息
|
||||
dataSizeDO.setId(sizeId);
|
||||
dataSizeDO.setSizeName(sizeName);
|
||||
//设置工厂和日期
|
||||
dataSizeDO.setFactoryId(factoryId);
|
||||
dataSizeDO.setDate(data.getDate());
|
||||
//设置入库破损数
|
||||
dataSizeDO.setType(3);
|
||||
dataSizeDO.setNum(data.getOutDamageNum());
|
||||
|
||||
factoryDataSizeDOs.add(dataSizeDO);
|
||||
}
|
||||
|
||||
factoryDataSizeMapper.insertBatch(factoryDataSizeDOs);
|
||||
}
|
||||
|
||||
respVO.getCreateUsernames().add(data.getFactoryName());
|
||||
});
|
||||
|
||||
return respVO;
|
||||
}
|
||||
|
||||
private void validateFactoryForCreate(String factoryName, String sizeName, LocalDate date) {
|
||||
|
||||
if (factoryName == null) {
|
||||
throw exception(FACTORY_INFO_NOT_EXISTS);
|
||||
}
|
||||
|
||||
if (sizeName == null) {
|
||||
throw exception(SIZE_NOT_EXISTS);
|
||||
}
|
||||
|
||||
String factoryId = factoryName.split(":")[0];
|
||||
|
||||
Long count = factoryDataSizeMapper.selectCountByType(Long.valueOf(factoryId), date, Arrays.asList(1,2,3,4));
|
||||
List<PackageDataDO> packageDOs = packageDataService.getListByFactoryIdAndDate(Long.valueOf(factoryId), date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
|
||||
|
||||
if (count > 0L || !packageDOs.isEmpty()) {
|
||||
throw exception(PACKAGE_DATA_EXISTS);
|
||||
}
|
||||
}
|
||||
}
|
@ -42,7 +42,7 @@ public interface FactoryDataSizeService {
|
||||
* 获得出入库规格数据 列表
|
||||
* @return 出入库规格数据
|
||||
*/
|
||||
List<FactoryDataInfoRespVO> getDetailList(Long factoryId, LocalDate[] date);
|
||||
List<FactoryDataInfoRespVO> getDetailList(Long factoryId, LocalDate[] date, LocalDateTime[] createTime);
|
||||
|
||||
/**
|
||||
* 获得指定时间段内 出入库规格数据之和
|
||||
|
@ -50,7 +50,7 @@ public class FactoryDataSizeServiceImpl implements FactoryDataSizeService{
|
||||
//校验 当前日期得 入库数据是否已经录入
|
||||
if (createReqVO.getType() == 2) {
|
||||
|
||||
Long count = factoryDataSizeMapper.selectCountByType(createReqVO.getFactoryId(), createReqVO.getDate(), Collections.singletonList(1));
|
||||
Long count = factoryDataSizeMapper.selectCountByType(createReqVO.getFactoryId(), createReqVO.getDate(), Arrays.asList(1,4));
|
||||
if (count > 0L) {
|
||||
throw exception(PACKAGE_DATA_EXISTS);
|
||||
}
|
||||
@ -113,6 +113,20 @@ public class FactoryDataSizeServiceImpl implements FactoryDataSizeService{
|
||||
|
||||
factoryDataSizeDOs.add(dataSizeDO);
|
||||
}
|
||||
|
||||
if (reqVO.getInNum() != null) {
|
||||
|
||||
FactoryDataSizeDO dataSizeDO = BeanUtils.toBean(reqVO, FactoryDataSizeDO.class);
|
||||
|
||||
//设置工厂和日期
|
||||
dataSizeDO.setFactoryId(createReqVO.getFactoryId());
|
||||
dataSizeDO.setDate(createReqVO.getDate());
|
||||
//设置入库数
|
||||
dataSizeDO.setType(4);
|
||||
dataSizeDO.setNum(reqVO.getInNum());
|
||||
|
||||
factoryDataSizeDOs.add(dataSizeDO);
|
||||
}
|
||||
}
|
||||
|
||||
factoryDataSizeMapper.insertBatch(factoryDataSizeDOs);
|
||||
@ -150,6 +164,27 @@ public class FactoryDataSizeServiceImpl implements FactoryDataSizeService{
|
||||
List<FactoryDataSizeDO> factoryDataSizeDOs = new ArrayList<>();
|
||||
for (FactoryDataSizeSaveReqVO reqVO : updateReqVO.getItems()) {
|
||||
|
||||
if (reqVO.getInNum() != null) {
|
||||
|
||||
FactoryDataSizeDO dataSizeDO = new FactoryDataSizeDO();
|
||||
|
||||
//设置入库数
|
||||
dataSizeDO.setId(reqVO.getInNumId());
|
||||
dataSizeDO.setNum(reqVO.getInNum());
|
||||
|
||||
if (reqVO.getInNumId() == null) {
|
||||
|
||||
dataSizeDO.setFactoryId(updateReqVO.getFactoryId());
|
||||
dataSizeDO.setDate(updateReqVO.getDate());
|
||||
dataSizeDO.setSizeId(reqVO.getSizeId());
|
||||
dataSizeDO.setSizeName(reqVO.getSizeName());
|
||||
dataSizeDO.setType(4);
|
||||
createSizeDos.add(dataSizeDO);
|
||||
}else {
|
||||
factoryDataSizeDOs.add(dataSizeDO);
|
||||
}
|
||||
}
|
||||
|
||||
if (reqVO.getInDamageNum() != null) {
|
||||
|
||||
FactoryDataSizeDO dataSizeDO = new FactoryDataSizeDO();
|
||||
@ -158,7 +193,17 @@ public class FactoryDataSizeServiceImpl implements FactoryDataSizeService{
|
||||
dataSizeDO.setId(reqVO.getInDamageNumId());
|
||||
dataSizeDO.setNum(reqVO.getInDamageNum());
|
||||
|
||||
factoryDataSizeDOs.add(dataSizeDO);
|
||||
if (reqVO.getInDamageNumId() == null) {
|
||||
|
||||
dataSizeDO.setFactoryId(updateReqVO.getFactoryId());
|
||||
dataSizeDO.setDate(updateReqVO.getDate());
|
||||
dataSizeDO.setSizeId(reqVO.getSizeId());
|
||||
dataSizeDO.setSizeName(reqVO.getSizeName());
|
||||
dataSizeDO.setType(1);
|
||||
createSizeDos.add(dataSizeDO);
|
||||
}else {
|
||||
factoryDataSizeDOs.add(dataSizeDO);
|
||||
}
|
||||
}
|
||||
|
||||
if (reqVO.getOutNum() != null) {
|
||||
@ -241,9 +286,9 @@ public class FactoryDataSizeServiceImpl implements FactoryDataSizeService{
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<FactoryDataInfoRespVO> getDetailList(Long factoryId, LocalDate[] date) {
|
||||
public List<FactoryDataInfoRespVO> getDetailList(Long factoryId, LocalDate[] date, LocalDateTime[] createTime) {
|
||||
|
||||
return factoryDataSizeMapper.selectDetailList(factoryId, date);
|
||||
return factoryDataSizeMapper.selectDetailList(factoryId, date, createTime);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -99,4 +99,10 @@ public interface FactoryInfoService {
|
||||
* @return 返回与给定工厂ID相关联的天气代码,类型为String。
|
||||
*/
|
||||
String getWeatherCodeByFactoryId(Long factoryId, String areaCode);
|
||||
|
||||
/**
|
||||
* 获得类型为工厂的工厂信息列表
|
||||
* @return 工厂列表
|
||||
*/
|
||||
List<FactoryInfoDO> getFactoryListByAuthority();
|
||||
}
|
||||
|
@ -14,6 +14,8 @@ import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factoryinfo.FactoryIn
|
||||
import cn.iocoder.yudao.module.smartfactory.dal.mysql.factoryinfo.FactoryInfoMapper;
|
||||
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
|
||||
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
|
||||
import cn.iocoder.yudao.module.system.api.permission.PermissionApi;
|
||||
import cn.iocoder.yudao.module.system.api.permission.dto.DeptDataPermissionRespDTO;
|
||||
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
||||
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
|
||||
import org.springframework.stereotype.Service;
|
||||
@ -24,6 +26,7 @@ import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
|
||||
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
||||
import static cn.iocoder.yudao.module.smartfactory.enums.ErrorCodeConstants.FACTORY_INFO_NOT_EXISTS;
|
||||
import static cn.iocoder.yudao.module.smartfactory.enums.ErrorCodeConstants.FACTOYRY_EXISTS_STAFF;
|
||||
@ -46,6 +49,9 @@ public class FactoryInfoServiceImpl implements FactoryInfoService {
|
||||
@Resource
|
||||
private AdminUserApi userApi;
|
||||
|
||||
@Resource
|
||||
private PermissionApi permissionApi;
|
||||
|
||||
@Override
|
||||
public Long createFactoryInfo(FactoryInfoSaveReqVO createReqVO) {
|
||||
// 插入
|
||||
@ -125,9 +131,7 @@ public class FactoryInfoServiceImpl implements FactoryInfoService {
|
||||
@Override
|
||||
public List<FactoryInfoDO> getFactoryListByType() {
|
||||
|
||||
DeptRespDTO deptRespDTO = deptApi.getDept(userApi.getUser(getLoginUserId()).getCheckedData().getDeptId()).getCheckedData();
|
||||
|
||||
return factoryInfoMapper.selectListByType(deptRespDTO.getFactoryId());
|
||||
return factoryInfoMapper.selectListByType(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -189,4 +193,27 @@ public class FactoryInfoServiceImpl implements FactoryInfoService {
|
||||
public String getWeatherCodeByFactoryId(Long factoryId, String areaCode) {
|
||||
return factoryInfoMapper.getWeatherCodeByFactoryId(factoryId, areaCode);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<FactoryInfoDO> getFactoryListByAuthority() {
|
||||
|
||||
List<Long> factoryIds = null;
|
||||
DeptDataPermissionRespDTO deptDataPermission = permissionApi.getDeptDataPermission(getLoginUserId()).getCheckedData();
|
||||
// 如果当前登录用户数据权限 不是查看全部数据
|
||||
if (!deptDataPermission.getAll()) {
|
||||
|
||||
List<DeptRespDTO> deptRespDTO = deptApi.getDeptListByLeader(getLoginUserId()).getCheckedData();
|
||||
|
||||
if (deptRespDTO != null) {
|
||||
|
||||
factoryIds = convertList(deptRespDTO, DeptRespDTO::getFactoryId);
|
||||
}else {
|
||||
|
||||
DeptRespDTO respDTO = deptApi.getDept(userApi.getUser(getLoginUserId()).getCheckedData().getDeptId()).getCheckedData();
|
||||
factoryIds = Collections.singletonList(respDTO.getFactoryId());
|
||||
}
|
||||
}
|
||||
|
||||
return factoryInfoMapper.selectListByType(factoryIds);
|
||||
}
|
||||
}
|
@ -53,6 +53,14 @@ public interface PackageService {
|
||||
*/
|
||||
List<PackageRespVO> getPackageByFactoryId(Long factoryId);
|
||||
|
||||
/**
|
||||
* 获得指定工厂的打包线
|
||||
* @param factoryId 工厂编号
|
||||
* @param sizeId 规格编号
|
||||
* @return 打包线信息
|
||||
*/
|
||||
PackageDO getPackageByFactoryIdAndSize(Long factoryId, Long sizeId);
|
||||
|
||||
/**
|
||||
* 获得打包线分页
|
||||
*
|
||||
|
@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.smartfactory.service.packageInfo;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.packageInfo.vo.PackagePageReqVO;
|
||||
import cn.iocoder.yudao.module.smartfactory.controller.admin.packageInfo.vo.PackageRespVO;
|
||||
@ -106,6 +107,14 @@ public class PackageServiceImpl implements PackageService {
|
||||
return respVOS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PackageDO getPackageByFactoryIdAndSize(Long factoryId, Long sizeId) {
|
||||
|
||||
return packageMapper.selectOne(new LambdaQueryWrapperX<PackageDO>()
|
||||
.eq(PackageDO::getFactoryId, factoryId)
|
||||
.eq(PackageDO::getSizeId, sizeId));
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageResult<PackageRespVO> getPackagePage(PackagePageReqVO pageReqVO) {
|
||||
|
||||
|
@ -19,6 +19,13 @@ import java.util.List;
|
||||
*/
|
||||
public interface PackageDataService {
|
||||
|
||||
/**
|
||||
* 创建打包线数据
|
||||
*
|
||||
* @param createReqVO 创建信息
|
||||
*/
|
||||
void create(@Valid PackageDataDO createReqVO);
|
||||
|
||||
/**
|
||||
* 创建打包线数据
|
||||
*
|
||||
|
@ -46,6 +46,12 @@ public class PackageDataServiceImpl implements PackageDataService {
|
||||
@Lazy // 循环依赖,避免报错
|
||||
private FactoryDataService factoryDataService;
|
||||
|
||||
@Override
|
||||
public void create(PackageDataDO createReqVO) {
|
||||
|
||||
packageDataMapper.insert(createReqVO);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long createPackageData(PackageDataCreateReqVO createReqVO) {
|
||||
|
||||
|
@ -18,22 +18,43 @@
|
||||
a.size_id AS sizeId,
|
||||
a.size_name AS sizeName,
|
||||
a.size_pieces AS sizePieces,
|
||||
MAX(a.num) AS num,
|
||||
MAX(a.auto_num) AS autoNum,
|
||||
MAX(a.num + a.auto_num) AS inNum,
|
||||
MAX(a.square_num) AS squareNum,
|
||||
MAX(a.damage_num) AS damageNum,
|
||||
MAX(CASE WHEN b.type = 1 THEN b.id END) AS inDamageNumId,
|
||||
MAX(CASE WHEN b.type = 1 THEN b.num END) AS inDamageNum,
|
||||
MAX(CASE WHEN b.type = 2 THEN b.id END) AS outNumId,
|
||||
MAX(CASE WHEN b.type = 2 THEN b.num END) AS outNum,
|
||||
MAX(CASE WHEN b.type = 3 THEN b.id END) AS outDamageNumId,
|
||||
MAX(CASE WHEN b.type = 3 THEN b.num END) AS outDamageNum
|
||||
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 AS a
|
||||
LEFT JOIN
|
||||
sf_factory_data_size AS b
|
||||
ON a.factory_id = b.factory_id and a.package_date = b.date and a.size_id = b.size_id
|
||||
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">
|
||||
@ -47,6 +68,14 @@
|
||||
AND a.package_date <= #{date[1]}
|
||||
</if>
|
||||
</if>
|
||||
<if test="dateTime != null and dateTime.length > 0">
|
||||
<if test="dateTime[0] != null">
|
||||
AND a.create_time >= #{dateTime[0]}
|
||||
</if>
|
||||
<if test="dateTime[1] != null">
|
||||
AND a.create_time <= #{dateTime[1]}
|
||||
</if>
|
||||
</if>
|
||||
</where>
|
||||
GROUP BY a.id,a.factory_id,a.package_name,a.package_date,a.size_id,a.size_name,a.size_pieces
|
||||
|
||||
@ -62,9 +91,10 @@
|
||||
NULL AS sizePieces,
|
||||
NULL AS num,
|
||||
NULL AS autoNum,
|
||||
NULL AS inNum,
|
||||
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.num END) AS inNum,
|
||||
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 = 2 THEN c.id END) AS outNumId,
|
||||
@ -74,7 +104,14 @@
|
||||
FROM
|
||||
sf_factory_data_size AS c
|
||||
WHERE
|
||||
NOT EXISTS (SELECT 1 FROM sf_package_data WHERE size_id = c.size_id and package_date = c.date)
|
||||
NOT EXISTS (
|
||||
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">
|
||||
AND c.factory_id = #{factoryId}
|
||||
@ -87,6 +124,14 @@
|
||||
AND c.date <= #{date[1]}
|
||||
</if>
|
||||
</if>
|
||||
<if test="dateTime != null and dateTime.length > 0">
|
||||
<if test="dateTime[0] != null">
|
||||
AND c.create_time >= #{dateTime[0]}
|
||||
</if>
|
||||
<if test="dateTime[1] != null">
|
||||
AND c.create_time <= #{dateTime[1]}
|
||||
</if>
|
||||
</if>
|
||||
GROUP BY c.factory_id,c.date,c.size_id,c.size_name
|
||||
</select>
|
||||
|
||||
@ -94,6 +139,7 @@
|
||||
SELECT
|
||||
factory_id AS factoryId,
|
||||
date AS date,
|
||||
SUM( CASE WHEN type = 4 THEN num END ) AS inNum,
|
||||
SUM( CASE WHEN type = 1 THEN num END ) AS inDamageNum,
|
||||
SUM( CASE WHEN type = 2 THEN num END ) AS outNum,
|
||||
SUM( CASE WHEN type = 3 THEN num END ) AS outDamageNum
|
||||
|
Loading…
Reference in New Issue
Block a user