This commit is contained in:
aikai 2024-06-05 22:33:53 +08:00
commit e6292c3ae2
30 changed files with 716 additions and 110 deletions

View File

@ -2,6 +2,7 @@ package cn.iocoder.yudao.framework.excel.core.util;
import com.alibaba.excel.EasyExcel; import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.converters.longconverter.LongStringConverter; import com.alibaba.excel.converters.longconverter.LongStringConverter;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@ -37,7 +38,9 @@ public class ExcelUtils {
.autoCloseStream(false) // 不要自动关闭交给 Servlet 自己处理 .autoCloseStream(false) // 不要自动关闭交给 Servlet 自己处理
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 基于 column 长度自动适配最大 255 宽度 .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 基于 column 长度自动适配最大 255 宽度
.registerConverter(new LongStringConverter()) // 避免 Long 类型丢失精度 .registerConverter(new LongStringConverter()) // 避免 Long 类型丢失精度
.sheet(sheetName).doWrite(data); .excelType(ExcelTypeEnum.XLSX)
.sheet(sheetName)
.doWrite(data);
// 设置 header contentType写在最后的原因是避免报错时响应 contentType 已经被修改了 // 设置 header contentType写在最后的原因是避免报错时响应 contentType 已经被修改了
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, StandardCharsets.UTF_8.name())); 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, 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 // 输出excel
EasyExcel.write(response.getOutputStream(), head) EasyExcel.write(response.getOutputStream(), head)
.autoCloseStream(false) // 不要自动关闭交给 Servlet 自己处理 .autoCloseStream(false) // 不要自动关闭交给 Servlet 自己处理
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 基于 column 长度自动适配最大 255 宽度 .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 基于 column 长度自动适配最大 255 宽度
.registerWriteHandler(new SpinnerWriteHandler(deptName, postName)) .registerWriteHandler(new SpinnerWriteHandler(col, value, col1, value1))
.registerConverter(new LongStringConverter()) // 避免 Long 类型丢失精度 .registerConverter(new LongStringConverter()) // 避免 Long 类型丢失精度
.sheet(sheetName).doWrite(data); .sheet(sheetName).doWrite(data);

View File

@ -16,6 +16,10 @@ import java.util.Map;
public class SpinnerWriteHandler implements SheetWriteHandler { public class SpinnerWriteHandler implements SheetWriteHandler {
private int col;
private int col1;
private List<String> deptName; private List<String> deptName;
private List<String> postName; private List<String> postName;
@ -23,8 +27,11 @@ public class SpinnerWriteHandler implements SheetWriteHandler {
public SpinnerWriteHandler() { 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.deptName = deptName;
this.postName = postName; this.postName = postName;
} }
@ -35,8 +42,8 @@ public class SpinnerWriteHandler implements SheetWriteHandler {
Map<Integer, String[]> mapDropDown = new HashMap<>(); Map<Integer, String[]> mapDropDown = new HashMap<>();
// 这里的key值 对应导出列的顺序 从0开始 // 这里的key值 对应导出列的顺序 从0开始
mapDropDown.put(1, deptName.toArray(new String[0])); mapDropDown.put(col, deptName.toArray(new String[0]));
mapDropDown.put(2, postName.toArray(new String[0])); mapDropDown.put(col1, postName.toArray(new String[0]));
Sheet sheet = writeSheetHolder.getSheet(); Sheet sheet = writeSheetHolder.getSheet();
/// 开始设置下拉框 /// 开始设置下拉框
DataValidationHelper helper = sheet.getDataValidationHelper();// 设置下拉框 DataValidationHelper helper = sheet.getDataValidationHelper();// 设置下拉框

View File

@ -66,6 +66,11 @@ public interface DeptApi {
@Parameter(name = "factoryId", description = "工厂编号", example = "100001", required = true) @Parameter(name = "factoryId", description = "工厂编号", example = "100001", required = true)
CommonResult<DeptRespDTO> getDeptByFactoryId(@RequestParam("factoryId") Long factoryId); CommonResult<DeptRespDTO> getDeptByFactoryId(@RequestParam("factoryId") Long factoryId);
@GetMapping(PREFIX + "/getListByLeader")
@Operation(summary = "获取所有部门信息")
@Parameter(name = "userId", description = "用户编号", example = "146", required = true)
CommonResult<List<DeptRespDTO>> getDeptListByLeader(@RequestParam("userId") Long userId);
/** /**
* 获得指定编号的部门 Map * 获得指定编号的部门 Map
* *

View File

@ -101,4 +101,11 @@ public class DeptApiImpl implements DeptApi {
DeptDO deptDO = deptService.getDeptByFactoryId(factoryId); DeptDO deptDO = deptService.getDeptByFactoryId(factoryId);
return success(BeanUtils.toBean(deptDO, DeptRespDTO.class)); return success(BeanUtils.toBean(deptDO, DeptRespDTO.class));
} }
@Override
public CommonResult<List<DeptRespDTO>> getDeptListByLeader(Long userId) {
List<DeptDO> deptDOS = deptService.getDeptByLeaderId(userId);
return success(BeanUtils.toBean(deptDOS, DeptRespDTO.class));
}
} }

View File

@ -215,7 +215,9 @@ public class UserController {
// 输出 Excel // 输出 Excel
ExcelUtils.write(response, "用户数据.xls", "数据", UserRespVO.class, ExcelUtils.write(response, "用户数据.xls", "数据", UserRespVO.class,
UserConvert.INSTANCE.convertList(list, deptMap, postMap), getDeptNameFun(deptDO), getPostNameFun(postDO)); UserConvert.INSTANCE.convertList(list, deptMap, postMap),
1, getDeptNameFun(deptDO),
2, getPostNameFun(postDO));
} }
@GetMapping("/get-import-template") @GetMapping("/get-import-template")
@ -237,7 +239,10 @@ public class UserController {
postDO.sort(Comparator.comparing(PostDO::getSort)); postDO.sort(Comparator.comparing(PostDO::getSort));
// 输出 // 输出
ExcelUtils.write(response, "用户导入模板.xlsx", "用户列表", UserImportExcelVO.class, null, getDeptNameFun(deptDO), getPostNameFun(postDO)); ExcelUtils.write(response, "用户导入模板.xlsx", "用户列表",
UserImportExcelVO.class, null,
1, getDeptNameFun(deptDO),
2, getPostNameFun(postDO));
} }
@PostMapping("/import") @PostMapping("/import")

View File

@ -24,4 +24,6 @@ public interface ErrorCodeConstants {
//出入库数据模块 //出入库数据模块
ErrorCode SIZEDATA_NOT_EXISTS = new ErrorCode(1_000_002_001, "不能操作非当天录入得数据"); ErrorCode SIZEDATA_NOT_EXISTS = new ErrorCode(1_000_002_001, "不能操作非当天录入得数据");
ErrorCode FACTORY_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_000_002_002, "导入出入库数据不能为空!");
} }

View File

@ -1,3 +0,0 @@
// TODO 待办请将下面的错误码复制到 yudao-module-smartfactory-api 模块的 ErrorCodeConstants 类中注意请给TODO 补充编号设置一个错误码编号
// ========== 工厂信息 TODO 补充编号 ==========
ErrorCode FACTORY_INFO_NOT_EXISTS = new ErrorCode(TODO 补充编号, "工厂信息不存在");

View File

@ -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.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult; 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.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; 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.*;
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.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.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.FactoryDataService;
import cn.iocoder.yudao.module.smartfactory.service.factorydata.FactoryDataSizeService; 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.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse; 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.List; 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.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
@ -40,6 +46,12 @@ public class FactoryDataController {
@Resource @Resource
private FactoryDataSizeService factoryDataSizeService; private FactoryDataSizeService factoryDataSizeService;
@Resource
private FactoryInfoService factoryInfoService;
@Resource
private SizeService sizeService;
@PostMapping("/create-size") @PostMapping("/create-size")
@Operation(summary = "创建工厂出库入库规格数据") @Operation(summary = "创建工厂出库入库规格数据")
@PreAuthorize("@ss.hasPermission('smartfactory:factory-data:create')") @PreAuthorize("@ss.hasPermission('smartfactory:factory-data:create')")
@ -110,8 +122,51 @@ public class FactoryDataController {
HttpServletResponse response) throws IOException { HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<FactoryDataDetailRespVO> list = dataService.getDataPage(pageReqVO).getList(); 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 // 导出 Excel
ExcelUtils.write(response, "工厂出库入库数据.xls", "数据", FactoryDataDetailRespVO.class, ExcelUtils.write(response, "工厂出库入库数据.xlsx", "数据", FactoryDataExportVO.class, exportVOS);
list); }
@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));
} }
} }

View File

@ -20,6 +20,11 @@ public class FactoryDataDetailRespVO {
@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;
/**
* 规格明细
*/
private List<FactoryDataInfoRespVO> items;
@Schema(description = "入库总箱数") @Schema(description = "入库总箱数")
private Integer inTotalNum; private Integer inTotalNum;
@ -34,9 +39,4 @@ public class FactoryDataDetailRespVO {
@Schema(description = "是否可编辑 | 1可 ") @Schema(description = "是否可编辑 | 1可 ")
private Integer isEdit; private Integer isEdit;
/**
* 规格明细
*/
private List<FactoryDataInfoRespVO> items;
} }

View File

@ -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;
}

View File

@ -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;
}

View File

@ -37,6 +37,9 @@ public class FactoryDataInfoRespVO {
@Schema(description = "自动打包数") @Schema(description = "自动打包数")
private Integer autoNum; private Integer autoNum;
@Schema(description = "入库数量Id")
private Long inNumId;
@Schema(description = "入库数量") @Schema(description = "入库数量")
private Integer inNum; private Integer inNum;

View File

@ -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;
}

View File

@ -50,6 +50,12 @@ public class FactoryDataSizeDetailRespVO {
@Schema(description = "自动打包数") @Schema(description = "自动打包数")
private Integer autoNum; private Integer autoNum;
@Schema(description = "入库数Id")
private Long inNumId;
@Schema(description = "入库数")
private Integer inNum;
@Schema(description = "打包破损数") @Schema(description = "打包破损数")
private Integer damageNum; private Integer damageNum;
@ -58,6 +64,9 @@ public class FactoryDataSizeDetailRespVO {
@Schema(description = "入库破损数") @Schema(description = "入库破损数")
private Integer inDamageNum; private Integer inDamageNum;
@Schema(description = "是否可编辑 | 0否 1是")
private Integer isEnable = 0;
} }
@Data @Data

View File

@ -21,6 +21,12 @@ public class FactoryDataSizeSaveReqVO {
@NotNull(message = "规格片数不能为空") @NotNull(message = "规格片数不能为空")
private Integer sizePieces; private Integer sizePieces;
@Schema(description = "入库数量Id")
private Long inNumId;
@Schema(description = "入库数量")
private Integer inNum;
@Schema(description = "入库破损数量Id") @Schema(description = "入库破损数量Id")
private Long inDamageNumId; private Long inDamageNumId;

View File

@ -79,6 +79,15 @@ public class FactoryInfoController {
return success(BeanUtils.toBean(factoryInfo, FactorySimpleRespVO.class)); 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") @GetMapping("/page")
@Operation(summary = "获得工厂信息分页") @Operation(summary = "获得工厂信息分页")
@PreAuthorize("@ss.hasPermission('smartfactory:factory-info:query')") @PreAuthorize("@ss.hasPermission('smartfactory:factory-info:query')")

View File

@ -20,7 +20,9 @@ import java.util.List;
@Mapper @Mapper
public interface FactoryDataSizeMapper extends BaseMapperX<FactoryDataSizeDO> { 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) { default void deleteByFactoryId(Long factoryId, String date) {

View File

@ -29,11 +29,11 @@ public interface FactoryInfoMapper extends BaseMapperX<FactoryInfoDO> {
.orderByAsc(FactoryInfoDO::getSort)); .orderByAsc(FactoryInfoDO::getSort));
} }
default List<FactoryInfoDO> selectListByType(Long factoryId) { default List<FactoryInfoDO> selectListByType(List<Long> factoryId) {
return selectList(new LambdaQueryWrapperX<FactoryInfoDO>() return selectList(new LambdaQueryWrapperX<FactoryInfoDO>()
.eq(FactoryInfoDO::getType, 3) .eq(FactoryInfoDO::getType, 3)
.eqIfPresent(FactoryInfoDO::getId, factoryId)); .inIfPresent(FactoryInfoDO::getId, factoryId));
} }
/** /**

View File

@ -71,6 +71,12 @@ public class FactoryDataJob {
data.setDamageNum(data.getDamageNum() + infos.get(0).getInDamageNum()); 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) { if (infos.get(0).getOutNum() != null) {

View File

@ -1,9 +1,7 @@
package cn.iocoder.yudao.module.smartfactory.service.factorydata; package cn.iocoder.yudao.module.smartfactory.service.factorydata;
import cn.iocoder.yudao.framework.common.pojo.PageResult; 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.*;
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.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;
@ -92,4 +90,11 @@ public interface FactoryDataService {
* @return 出入库数据 * @return 出入库数据
*/ */
FactoryDataDO getListByType(Long factoryId, LocalDate date, Integer type); FactoryDataDO getListByType(Long factoryId, LocalDate date, Integer type);
/**
* 导入出入库数据
* @param list 数据
* @return 结果
*/
FactoryImportRespVO importUserList(List<FactoryDataImportVO> list);
} }

View File

@ -1,25 +1,28 @@
package cn.iocoder.yudao.module.smartfactory.service.factorydata; package cn.iocoder.yudao.module.smartfactory.service.factorydata;
import cn.hutool.core.bean.BeanUtil; 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.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.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils; 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.*;
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.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.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.controller.admin.packagedata.vo.PackageDataCreateReqVO;
import cn.iocoder.yudao.module.smartfactory.convert.packageData.PackageDataConvert; 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.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.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.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.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.packagedata.PackageDataService; import cn.iocoder.yudao.module.smartfactory.service.packagedata.PackageDataService;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
@ -34,7 +37,9 @@ import java.time.format.DateTimeFormatter;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; 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.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 @Resource
private PackageDataService packageDataService; private PackageDataService packageDataService;
@Resource
private FactoryDataSizeMapper factoryDataSizeMapper;
@Resource
private PackageService packageService;
@Override @Override
public Long createData(List<FactoryDataDO> factoryDataDOS) { public Long createData(List<FactoryDataDO> factoryDataDOS) {
@ -131,13 +142,23 @@ public class FactoryDataServiceImpl implements FactoryDataService {
respVO.setDate(LocalDate.parse(date)); 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( List<FactoryDataSizeDetailRespVO.InItem> packageInfo = infoRespVOS.stream()
infoRespVOS.stream() .filter(info -> (info.getInDamageNum() != null && info.getInNum() == null) || info.getNum() != null || info.getAutoNum() != null)
.filter(info -> info.getInNum() != null || info.getInDamageNum() != null) .map(info -> BeanUtil.toBean(info, FactoryDataSizeDetailRespVO.InItem.class))
.map(info -> BeanUtil.toBean(info, FactoryDataSizeDetailRespVO.InItem.class)) .collect(Collectors.toList());
.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( respVO.setOutItems(
infoRespVOS.stream() infoRespVOS.stream()
@ -156,6 +177,9 @@ public class FactoryDataServiceImpl implements FactoryDataService {
IPage<FactoryDataDetailRespVO> page = dataMapper.selectDetailPage(mpPage, pageReqVO); IPage<FactoryDataDetailRespVO> page = dataMapper.selectDetailPage(mpPage, pageReqVO);
PageResult<FactoryDataDetailRespVO> dataPage = new PageResult<>(page.getRecords(), page.getTotal()); 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(); List<FactoryDataDetailRespVO> respVOS = dataPage.getList();
if (!respVOS.isEmpty()) { if (!respVOS.isEmpty()) {
@ -164,15 +188,18 @@ public class FactoryDataServiceImpl implements FactoryDataService {
List<FactoryInfoDO> factoryInfoDOS = factoryInfoService.getFactoryList(factoryIdS); List<FactoryInfoDO> factoryInfoDOS = factoryInfoService.getFactoryList(factoryIdS);
Map<Long, FactoryInfoDO> factoryMap = convertMap(factoryInfoDOS, FactoryInfoDO::getId); Map<Long, FactoryInfoDO> factoryMap = convertMap(factoryInfoDOS, FactoryInfoDO::getId);
//获得 入库数打包破损入库破损出库数出库破损的工厂规格数据
List<FactoryDataInfoRespVO> infoDatas = dataSizeService.getDetailList(pageReqVO.getFactoryId(), pageReqVO.getDate());
respVOS.forEach(items -> { respVOS.forEach(items -> {
//规格明细数据 //规格明细数据
List<FactoryDataInfoRespVO> infoList = infoDatas.stream() List<FactoryDataInfoRespVO> infoList = infoDatas.stream()
.filter(data -> data.getFactoryId().equals(items.getFactoryId()) && data.getDate().equals(items.getDate())) .filter(data -> data.getFactoryId().equals(items.getFactoryId()) && data.getDate().equals(items.getDate()))
.collect(Collectors.toList()); .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.setItems(infoList);
items.setFactoryName(factoryMap.get(items.getFactoryId()).getName()); items.setFactoryName(factoryMap.get(items.getFactoryId()).getName());
@ -180,53 +207,79 @@ public class FactoryDataServiceImpl implements FactoryDataService {
//移除 已处理过的数据 //移除 已处理过的数据
infoDatas.removeAll(infoList); infoDatas.removeAll(infoList);
}); });
}else {
// 展示当天录入的数据 respVOS = new ArrayList<>();
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());
}
} }
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 @Override
@ -258,4 +311,155 @@ public class FactoryDataServiceImpl implements FactoryDataService {
return dataMapper.selectListByType(factoryId, date, type); 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);
}
}
} }

View File

@ -42,7 +42,7 @@ public interface FactoryDataSizeService {
* 获得出入库规格数据 列表 * 获得出入库规格数据 列表
* @return 出入库规格数据 * @return 出入库规格数据
*/ */
List<FactoryDataInfoRespVO> getDetailList(Long factoryId, LocalDate[] date); List<FactoryDataInfoRespVO> getDetailList(Long factoryId, LocalDate[] date, LocalDateTime[] createTime);
/** /**
* 获得指定时间段内 出入库规格数据之和 * 获得指定时间段内 出入库规格数据之和

View File

@ -50,7 +50,7 @@ public class FactoryDataSizeServiceImpl implements FactoryDataSizeService{
//校验 当前日期得 入库数据是否已经录入 //校验 当前日期得 入库数据是否已经录入
if (createReqVO.getType() == 2) { 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) { if (count > 0L) {
throw exception(PACKAGE_DATA_EXISTS); throw exception(PACKAGE_DATA_EXISTS);
} }
@ -113,6 +113,20 @@ public class FactoryDataSizeServiceImpl implements FactoryDataSizeService{
factoryDataSizeDOs.add(dataSizeDO); 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); factoryDataSizeMapper.insertBatch(factoryDataSizeDOs);
@ -150,6 +164,27 @@ public class FactoryDataSizeServiceImpl implements FactoryDataSizeService{
List<FactoryDataSizeDO> factoryDataSizeDOs = new ArrayList<>(); List<FactoryDataSizeDO> factoryDataSizeDOs = new ArrayList<>();
for (FactoryDataSizeSaveReqVO reqVO : updateReqVO.getItems()) { 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) { if (reqVO.getInDamageNum() != null) {
FactoryDataSizeDO dataSizeDO = new FactoryDataSizeDO(); FactoryDataSizeDO dataSizeDO = new FactoryDataSizeDO();
@ -158,7 +193,17 @@ public class FactoryDataSizeServiceImpl implements FactoryDataSizeService{
dataSizeDO.setId(reqVO.getInDamageNumId()); dataSizeDO.setId(reqVO.getInDamageNumId());
dataSizeDO.setNum(reqVO.getInDamageNum()); 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) { if (reqVO.getOutNum() != null) {
@ -241,9 +286,9 @@ public class FactoryDataSizeServiceImpl implements FactoryDataSizeService{
} }
@Override @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 @Override

View File

@ -99,4 +99,10 @@ public interface FactoryInfoService {
* @return 返回与给定工厂ID相关联的天气代码类型为String * @return 返回与给定工厂ID相关联的天气代码类型为String
*/ */
String getWeatherCodeByFactoryId(Long factoryId, String areaCode); String getWeatherCodeByFactoryId(Long factoryId, String areaCode);
/**
* 获得类型为工厂的工厂信息列表
* @return 工厂列表
*/
List<FactoryInfoDO> getFactoryListByAuthority();
} }

View File

@ -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.smartfactory.dal.mysql.factoryinfo.FactoryInfoMapper;
import cn.iocoder.yudao.module.system.api.dept.DeptApi; 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.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.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -24,6 +26,7 @@ import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
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.framework.common.util.collection.CollectionUtils.convertList;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; 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.FACTORY_INFO_NOT_EXISTS;
import static cn.iocoder.yudao.module.smartfactory.enums.ErrorCodeConstants.FACTOYRY_EXISTS_STAFF; import static cn.iocoder.yudao.module.smartfactory.enums.ErrorCodeConstants.FACTOYRY_EXISTS_STAFF;
@ -46,6 +49,9 @@ public class FactoryInfoServiceImpl implements FactoryInfoService {
@Resource @Resource
private AdminUserApi userApi; private AdminUserApi userApi;
@Resource
private PermissionApi permissionApi;
@Override @Override
public Long createFactoryInfo(FactoryInfoSaveReqVO createReqVO) { public Long createFactoryInfo(FactoryInfoSaveReqVO createReqVO) {
// 插入 // 插入
@ -125,9 +131,7 @@ public class FactoryInfoServiceImpl implements FactoryInfoService {
@Override @Override
public List<FactoryInfoDO> getFactoryListByType() { public List<FactoryInfoDO> getFactoryListByType() {
DeptRespDTO deptRespDTO = deptApi.getDept(userApi.getUser(getLoginUserId()).getCheckedData().getDeptId()).getCheckedData(); return factoryInfoMapper.selectListByType(null);
return factoryInfoMapper.selectListByType(deptRespDTO.getFactoryId());
} }
@Override @Override
@ -189,4 +193,27 @@ public class FactoryInfoServiceImpl implements FactoryInfoService {
public String getWeatherCodeByFactoryId(Long factoryId, String areaCode) { public String getWeatherCodeByFactoryId(Long factoryId, String areaCode) {
return factoryInfoMapper.getWeatherCodeByFactoryId(factoryId, 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);
}
} }

View File

@ -53,6 +53,14 @@ public interface PackageService {
*/ */
List<PackageRespVO> getPackageByFactoryId(Long factoryId); List<PackageRespVO> getPackageByFactoryId(Long factoryId);
/**
* 获得指定工厂的打包线
* @param factoryId 工厂编号
* @param sizeId 规格编号
* @return 打包线信息
*/
PackageDO getPackageByFactoryIdAndSize(Long factoryId, Long sizeId);
/** /**
* 获得打包线分页 * 获得打包线分页
* *

View File

@ -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.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 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.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.PackagePageReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.packageInfo.vo.PackageRespVO; import cn.iocoder.yudao.module.smartfactory.controller.admin.packageInfo.vo.PackageRespVO;
@ -106,6 +107,14 @@ public class PackageServiceImpl implements PackageService {
return respVOS; 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 @Override
public PageResult<PackageRespVO> getPackagePage(PackagePageReqVO pageReqVO) { public PageResult<PackageRespVO> getPackagePage(PackagePageReqVO pageReqVO) {

View File

@ -19,6 +19,13 @@ import java.util.List;
*/ */
public interface PackageDataService { public interface PackageDataService {
/**
* 创建打包线数据
*
* @param createReqVO 创建信息
*/
void create(@Valid PackageDataDO createReqVO);
/** /**
* 创建打包线数据 * 创建打包线数据
* *

View File

@ -46,6 +46,12 @@ public class PackageDataServiceImpl implements PackageDataService {
@Lazy // 循环依赖避免报错 @Lazy // 循环依赖避免报错
private FactoryDataService factoryDataService; private FactoryDataService factoryDataService;
@Override
public void create(PackageDataDO createReqVO) {
packageDataMapper.insert(createReqVO);
}
@Override @Override
public Long createPackageData(PackageDataCreateReqVO createReqVO) { public Long createPackageData(PackageDataCreateReqVO createReqVO) {

View File

@ -18,22 +18,43 @@
a.size_id AS sizeId, a.size_id AS sizeId,
a.size_name AS sizeName, a.size_name AS sizeName,
a.size_pieces AS sizePieces, a.size_pieces AS sizePieces,
MAX(a.num) AS num, a.num AS num,
MAX(a.auto_num) AS autoNum, a.auto_num AS autoNum,
MAX(a.num + a.auto_num) AS inNum, a.square_num AS squareNum,
MAX(a.square_num) AS squareNum, a.damage_num AS damageNum,
MAX(a.damage_num) AS damageNum, b.inNumId,
MAX(CASE WHEN b.type = 1 THEN b.id END) AS inDamageNumId, b.inNum,
MAX(CASE WHEN b.type = 1 THEN b.num END) AS inDamageNum, b.inDamageNumId,
MAX(CASE WHEN b.type = 2 THEN b.id END) AS outNumId, b.inDamageNum,
MAX(CASE WHEN b.type = 2 THEN b.num END) AS outNum, b.outNumId,
MAX(CASE WHEN b.type = 3 THEN b.id END) AS outDamageNumId, b.outNum,
MAX(CASE WHEN b.type = 3 THEN b.num END) AS outDamageNum b.outDamageNumId,
b.outDamageNum
FROM FROM
sf_package_data AS a sf_package_data a
LEFT JOIN LEFT JOIN (
sf_factory_data_size AS b SELECT
ON a.factory_id = b.factory_id and a.package_date = b.date and a.size_id = b.size_id 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> <where>
a.deleted = 0 a.deleted = 0
<if test="factoryId != null"> <if test="factoryId != null">
@ -47,6 +68,14 @@
AND a.package_date &lt;= #{date[1]} AND a.package_date &lt;= #{date[1]}
</if> </if>
</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> </where>
GROUP BY a.id,a.factory_id,a.package_name,a.package_date,a.size_id,a.size_name,a.size_pieces 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 sizePieces,
NULL AS num, NULL AS num,
NULL AS autoNum, NULL AS autoNum,
NULL AS inNum,
NULL AS squareNum, NULL AS squareNum,
NULL AS damageNum, 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.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,
@ -74,7 +104,14 @@
FROM FROM
sf_factory_data_size AS c sf_factory_data_size AS c
WHERE 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 AND c.deleted = 0
<if test="factoryId != null"> <if test="factoryId != null">
AND c.factory_id = #{factoryId} AND c.factory_id = #{factoryId}
@ -87,6 +124,14 @@
AND c.date &lt;= #{date[1]} AND c.date &lt;= #{date[1]}
</if> </if>
</if> </if>
<if test="dateTime != null and dateTime.length > 0">
<if test="dateTime[0] != null">
AND c.create_time &gt;= #{dateTime[0]}
</if>
<if test="dateTime[1] != null">
AND c.create_time &lt;= #{dateTime[1]}
</if>
</if>
GROUP BY c.factory_id,c.date,c.size_id,c.size_name GROUP BY c.factory_id,c.date,c.size_id,c.size_name
</select> </select>
@ -94,6 +139,7 @@
SELECT SELECT
factory_id AS factoryId, factory_id AS factoryId,
date AS date, 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 = 1 THEN num END ) AS inDamageNum,
SUM( CASE WHEN type = 2 THEN num END ) AS outNum, SUM( CASE WHEN type = 2 THEN num END ) AS outNum,
SUM( CASE WHEN type = 3 THEN num END ) AS outDamageNum SUM( CASE WHEN type = 3 THEN num END ) AS outDamageNum