库区,仓储,工艺页面

This commit is contained in:
z 2026-05-07 17:41:58 +08:00
parent 1eb9857142
commit 1e5fe980b4
42 changed files with 1809 additions and 662 deletions

View File

@ -47,5 +47,6 @@ public class CheckItemPageReqVO extends PageParam {
@Schema(description = "打印是否取平均值")
private String printAvgValues;
@Schema(description = "编号")
private String itemNo;
}

View File

@ -79,4 +79,12 @@ public class ProcController {
return success(procService.getProcDropdown(keyWord));
}
// 下拉框
@GetMapping("/getProcList")
@Operation(summary = "获得工序不分页")
@PreAuthorize("@ss.hasPermission('biz:proc:query')")
public CommonResult<List<ProcRespVO>> getProcList() {
return success(procService.getProcList());
}
}

View File

@ -38,5 +38,7 @@ public class ProcRespVO {
@Schema(description = "备注", example = "你猜")
@ExcelProperty("备注")
private String remark;
private String creatorName;
}

View File

@ -0,0 +1,95 @@
package com.ningxia.yunxi.chemmes.module.biz.controller.admin.storearea;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;
import com.ningxia.yunxi.chemmes.framework.common.pojo.PageParam;
import com.ningxia.yunxi.chemmes.framework.common.pojo.PageResult;
import com.ningxia.yunxi.chemmes.framework.common.pojo.CommonResult;
import com.ningxia.yunxi.chemmes.framework.common.util.object.BeanUtils;
import static com.ningxia.yunxi.chemmes.framework.common.pojo.CommonResult.success;
import com.ningxia.yunxi.chemmes.framework.excel.core.util.ExcelUtils;
import com.ningxia.yunxi.chemmes.framework.operatelog.core.annotations.OperateLog;
import static com.ningxia.yunxi.chemmes.framework.operatelog.core.enums.OperateTypeEnum.*;
import com.ningxia.yunxi.chemmes.module.biz.controller.admin.storearea.vo.*;
import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.storearea.StoreAreaDO;
import com.ningxia.yunxi.chemmes.module.biz.service.storearea.StoreAreaService;
@Tag(name = "管理后台 - 库区主数据")
@RestController
@RequestMapping("/biz/store-area")
@Validated
public class StoreAreaController {
@Resource
private StoreAreaService storeAreaService;
@PostMapping("/create")
@Operation(summary = "创建库区主数据")
@PreAuthorize("@ss.hasPermission('biz:store-area:create')")
public CommonResult<Integer> createStoreArea(@Valid @RequestBody StoreAreaSaveReqVO createReqVO) {
return success(storeAreaService.createStoreArea(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新库区主数据")
@PreAuthorize("@ss.hasPermission('biz:store-area:update')")
public CommonResult<Boolean> updateStoreArea(@Valid @RequestBody StoreAreaSaveReqVO updateReqVO) {
storeAreaService.updateStoreArea(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除库区主数据")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('biz:store-area:delete')")
public CommonResult<Boolean> deleteStoreArea(@RequestParam("id") Integer id) {
storeAreaService.deleteStoreArea(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得库区主数据")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('biz:store-area:query')")
public CommonResult<StoreAreaRespVO> getStoreArea(@RequestParam("id") Integer id) {
StoreAreaDO storeArea = storeAreaService.getStoreArea(id);
return success(BeanUtils.toBean(storeArea, StoreAreaRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得库区主数据分页")
@PreAuthorize("@ss.hasPermission('biz:store-area:query')")
public CommonResult<PageResult<StoreAreaRespVO>> getStoreAreaPage(@Valid StoreAreaPageReqVO pageReqVO) {
PageResult<StoreAreaDO> pageResult = storeAreaService.getStoreAreaPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, StoreAreaRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出库区主数据 Excel")
@PreAuthorize("@ss.hasPermission('biz:store-area:export')")
@OperateLog(type = EXPORT)
public void exportStoreAreaExcel(@Valid StoreAreaPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<StoreAreaDO> list = storeAreaService.getStoreAreaPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "库区主数据.xls", "数据", StoreAreaRespVO.class,
BeanUtils.toBean(list, StoreAreaRespVO.class));
}
}

View File

@ -0,0 +1,45 @@
package com.ningxia.yunxi.chemmes.module.biz.controller.admin.storearea.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import com.ningxia.yunxi.chemmes.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static com.ningxia.yunxi.chemmes.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 库区主数据分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class StoreAreaPageReqVO extends PageParam {
@Schema(description = "创建人", example = "32562")
private String fCreatorUserId;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
@Schema(description = "库区编码")
private String storeAreCd;
@Schema(description = "库区名称", example = "芋艿")
private String storeAreaName;
@Schema(description = "状态(1启用 2 未启用)", example = "1")
private Integer enabledStatus;
@Schema(description = "备注", example = "你说的对")
private String remark;
@Schema(description = "仓库id", example = "23515")
private Integer storeHouseId;
@Schema(description = "仓库类型(1 原料库 2 在制品库 3 成品库)", example = "1")
private String storeType;
@Schema(description = "仓库名称")
private String storeHouseName;
}

View File

@ -0,0 +1,57 @@
package com.ningxia.yunxi.chemmes.module.biz.controller.admin.storearea.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import java.util.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
import com.ningxia.yunxi.chemmes.framework.excel.core.annotations.DictFormat;
import com.ningxia.yunxi.chemmes.framework.excel.core.convert.DictConvert;
@Schema(description = "管理后台 - 库区主数据 Response VO")
@Data
@ExcelIgnoreUnannotated
public class StoreAreaRespVO {
@Schema(description = "自增字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "5665")
@ExcelProperty("自增字段")
private Integer id;
@Schema(description = "创建人", example = "32562")
@ExcelProperty("创建人")
private String fCreatorUserId;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
@Schema(description = "库区编码")
@ExcelProperty("库区编码")
private String storeAreCd;
@Schema(description = "库区名称", example = "芋艿")
@ExcelProperty("库区名称")
private String storeAreaName;
@Schema(description = "状态(1启用 2 未启用)", example = "1")
@ExcelProperty(value = "状态(1启用 2 未启用)", converter = DictConvert.class)
@DictFormat("system_status") // TODO 代码优化建议设置到对应的 DictTypeConstants 枚举类中
private Integer enabledStatus;
@Schema(description = "备注", example = "你说的对")
@ExcelProperty("备注")
private String remark;
@Schema(description = "仓库id", example = "23515")
@ExcelProperty("仓库id")
private Integer storeHouseId;
@Schema(description = "仓库类型(1 原料库 2 在制品库 3 成品库)", example = "1")
@ExcelProperty("仓库类型(1 原料库 2 在制品库 3 成品库)")
private String storeType;
private String storeHouseName;
}

View File

@ -0,0 +1,37 @@
package com.ningxia.yunxi.chemmes.module.biz.controller.admin.storearea.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
import java.util.*;
@Schema(description = "管理后台 - 库区主数据新增/修改 Request VO")
@Data
public class StoreAreaSaveReqVO {
@Schema(description = "自增字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "5665")
private Integer id;
@Schema(description = "创建人", example = "32562")
private String fCreatorUserId;
@Schema(description = "库区编码")
private String storeAreCd;
@Schema(description = "库区名称", example = "芋艿")
private String storeAreaName;
@Schema(description = "状态(1启用 2 未启用)", example = "1")
private Integer enabledStatus;
@Schema(description = "备注", example = "你说的对")
private String remark;
@Schema(description = "仓库id", example = "23515")
private Integer storeHouseId;
@Schema(description = "仓库类型(1 原料库 2 在制品库 3 成品库)", example = "1")
private String storeType;
}

View File

@ -91,5 +91,14 @@ public class StoreHouseController {
ExcelUtils.write(response, "仓储主数据.xls", "数据", StoreHouseRespVO.class,
BeanUtils.toBean(list, StoreHouseRespVO.class));
}
@GetMapping("/get-store-house-select")
@Operation(summary = "获得仓储下拉框数据")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('biz:store-house:query')")
public CommonResult<List<StoreHouseRespVO>> getStoreHouseSelect() {
List<StoreHouseDO> list = storeHouseService.getStoreHouseSelect();
return success(BeanUtils.toBean(list, StoreHouseRespVO.class));
}
}

View File

@ -21,4 +21,7 @@ public class StoreHousePageReqVO extends PageParam {
@Schema(description = "状态(1启用 2 未启用)", example = "1")
private Integer enabledStatus;
private String storeType;
}

View File

@ -35,5 +35,7 @@ public class TechProcRespVO {
@Schema(description = "备注", example = "你猜")
@ExcelProperty("备注")
private String remark;
private String nickname;
}

View File

@ -1,5 +1,6 @@
package com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.checkitem;
import com.ningxia.yunxi.chemmes.framework.mybatis.core.dataobject.BaseDOWithoutLogic;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
@ -20,7 +21,7 @@ import com.ningxia.yunxi.chemmes.framework.mybatis.core.dataobject.BaseDO;
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class CheckItemDO extends BaseDO {
public class CheckItemDO extends BaseDOWithoutLogic {
/**
* 自增字段

View File

@ -1,5 +1,6 @@
package com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.proc;
import com.ningxia.yunxi.chemmes.module.biz.controller.admin.proc.vo.ProcRespVO;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
@ -45,5 +46,7 @@ public class ProcDO extends BaseDO {
* 备注
*/
private String remark;
@TableField(exist = false)
private String creatorName;
}

View File

@ -0,0 +1,59 @@
package com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.storearea;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import com.ningxia.yunxi.chemmes.framework.mybatis.core.dataobject.BaseDO;
/**
* 库区主数据 DO
*
* @author 管理员
*/
@TableName("tba_store_area")
@KeySequence("tba_store_area_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class StoreAreaDO extends BaseDO {
/**
* 自增字段
*/
@TableId
private Integer id;
/**
* 库区编码
*/
private String storeAreCd;
/**
* 库区名称
*/
private String storeAreaName;
/**
* 状态(1启用 2 未启用)
*
* 枚举 {@link TODO system_status 对应的类}
*/
private Integer enabledStatus;
/**
* 备注
*/
private String remark;
/**
* 仓库id
*/
private Integer storeHouseId;
/**
* 仓库类型(1 原料库 2 在制品库 3 成品库)
*/
private String storeType;
@TableField(exist = false)
private String storeHouseName;
}

View File

@ -41,5 +41,7 @@ public class TechProcDO extends BaseDO {
* 备注
*/
private String remark;
@TableField(exist = false)
private String nickname;
}

View File

@ -17,9 +17,25 @@ import com.ningxia.yunxi.chemmes.module.biz.controller.admin.checkitem.vo.*;
@Mapper
public interface CheckItemMapper extends BaseMapperX<CheckItemDO> {
/**
* 根据检验项类型和名称统计数量用于重复校验
*
* @param itemType 适用类型
* @param itemName 检验项名称
* @param excludeId 排除的ID更新时使用
* @return 符合条件的记录数
*/
default Long selectCountByItemTypeAndItemName(String itemType, String itemName, Integer excludeId) {
return selectCount(new LambdaQueryWrapperX<CheckItemDO>()
.eq(CheckItemDO::getItemType, itemType)
.eq(CheckItemDO::getItemName, itemName)
.ne(excludeId != null, CheckItemDO::getId, excludeId));
}
default PageResult<CheckItemDO> selectPage(CheckItemPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<CheckItemDO>()
.likeIfPresent(CheckItemDO::getItemName, reqVO.getItemName())
.likeIfPresent(CheckItemDO::getItemNo,reqVO.getItemNo())
.eqIfPresent(CheckItemDO::getNature, reqVO.getNature())
.likeIfPresent(CheckItemDO::getUnitName, reqVO.getUnitName())
.eqIfPresent(CheckItemDO::getCheckMethod, reqVO.getCheckMethod())
@ -31,7 +47,7 @@ public interface CheckItemMapper extends BaseMapperX<CheckItemDO> {
.eqIfPresent(CheckItemDO::getTestNum, reqVO.getTestNum())
.eqIfPresent(CheckItemDO::getFloatNum, reqVO.getFloatNum())
.eqIfPresent(CheckItemDO::getPrintAvgValues, reqVO.getPrintAvgValues())
.orderByDesc(CheckItemDO::getId));
.orderByDesc(CheckItemDO::getCreateTime));
}
}

View File

@ -33,4 +33,9 @@ public interface InspPlanItemMapper extends BaseMapperX<InspPlanItemDO> {
.orderByDesc(InspPlanItemDO::getId));
}
default Long selectByItemIdCount(Integer id){
return selectCount(new LambdaQueryWrapperX<InspPlanItemDO>()
.eq(InspPlanItemDO::getItemId, id));
}
}

View File

@ -1,10 +1,13 @@
package com.ningxia.yunxi.chemmes.module.biz.dal.mysql.proc;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.ningxia.yunxi.chemmes.framework.common.pojo.PageResult;
import com.ningxia.yunxi.chemmes.framework.mybatis.core.mapper.BaseMapperX;
import com.ningxia.yunxi.chemmes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.ningxia.yunxi.chemmes.module.biz.controller.admin.proc.vo.ProcPageReqVO;
import com.ningxia.yunxi.chemmes.module.biz.controller.admin.proc.vo.ProcRespVO;
import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.proc.ProcDO;
import com.ningxia.yunxi.chemmes.module.system.dal.dataobject.user.AdminUserDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@ -35,4 +38,15 @@ public interface ProcMapper extends BaseMapperX<ProcDO> {
default ProcDO selectByProcCd(String procCd) {
return selectOne(ProcDO::getProcCd, procCd);
}}
}
default List<ProcDO> getProcList(){
MPJLambdaWrapper<ProcDO> query = new MPJLambdaWrapper<>();
query.selectAll(ProcDO.class)
.select("u.nickname as creatorName")
.leftJoin(AdminUserDO.class,"u",AdminUserDO::getId,ProcDO::getCreator)
.eq(ProcDO::getEnabledStatus, 0)
.orderByAsc(ProcDO::getProcCd);
return selectList(query);
}
}

View File

@ -0,0 +1,39 @@
package com.ningxia.yunxi.chemmes.module.biz.dal.mysql.storearea;
import java.util.*;
import cn.hutool.core.util.ObjectUtil;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.ningxia.yunxi.chemmes.framework.common.pojo.PageResult;
import com.ningxia.yunxi.chemmes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.ningxia.yunxi.chemmes.framework.mybatis.core.mapper.BaseMapperX;
import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.storearea.StoreAreaDO;
import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.storehouse.StoreHouseDO;
import org.apache.ibatis.annotations.Mapper;
import com.ningxia.yunxi.chemmes.module.biz.controller.admin.storearea.vo.*;
/**
* 库区主数据 Mapper
*
* @author 管理员
*/
@Mapper
public interface StoreAreaMapper extends BaseMapperX<StoreAreaDO> {
default PageResult<StoreAreaDO> selectPage(StoreAreaPageReqVO reqVO) {
MPJLambdaWrapper<StoreAreaDO> query = new MPJLambdaWrapper<>();
query.selectAll(StoreAreaDO.class)
.select("s.store_house_name as storeHouseName")
.leftJoin(StoreHouseDO.class, "s",StoreHouseDO::getId,StoreAreaDO::getStoreHouseId)
.disableSubLogicDel();
query.eq(ObjectUtil.isNotEmpty( reqVO.getStoreType()),StoreAreaDO::getStoreType, reqVO.getStoreType());
query.like(ObjectUtil.isNotEmpty( reqVO.getStoreHouseName()),StoreHouseDO::getStoreHouseName, reqVO.getStoreHouseName());
query.eq(ObjectUtil.isNotEmpty( reqVO.getEnabledStatus()),StoreAreaDO::getEnabledStatus, reqVO.getEnabledStatus());
return selectPage(reqVO, query);
}
default Long selectByStoreAreCodeCount(String storeAreCd, Integer id){
return selectCount(new LambdaQueryWrapperX<StoreAreaDO>()
.eq(StoreAreaDO::getStoreAreCd, storeAreCd).ne(ObjectUtil.isNotEmpty(id),StoreAreaDO::getId,id));
}
}

View File

@ -2,6 +2,7 @@ package com.ningxia.yunxi.chemmes.module.biz.dal.mysql.storehouse;
import java.util.*;
import cn.hutool.core.util.ObjectUtil;
import com.ningxia.yunxi.chemmes.framework.common.pojo.PageResult;
import com.ningxia.yunxi.chemmes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.ningxia.yunxi.chemmes.framework.mybatis.core.mapper.BaseMapperX;
@ -21,7 +22,17 @@ public interface StoreHouseMapper extends BaseMapperX<StoreHouseDO> {
return selectPage(reqVO, new LambdaQueryWrapperX<StoreHouseDO>()
.likeIfPresent(StoreHouseDO::getStoreHouseName, reqVO.getStoreHouseName())
.eqIfPresent(StoreHouseDO::getEnabledStatus, reqVO.getEnabledStatus())
.eqIfPresent(StoreHouseDO::getStoreType, reqVO.getStoreType())
.orderByDesc(StoreHouseDO::getId));
}
default Long selectByStoreHouseCodeCount(String storeHouseCd,Integer id){
return selectCount(new LambdaQueryWrapperX<StoreHouseDO>()
.eq(StoreHouseDO::getStoreHouseCd, storeHouseCd).ne(ObjectUtil.isNotEmpty(id),StoreHouseDO::getId,id));
}
default List<StoreHouseDO> getStoreHouseSelect(){
return selectList(new LambdaQueryWrapperX<StoreHouseDO>()
.eq(StoreHouseDO::getEnabledStatus, 0));
}
}

View File

@ -1,11 +1,14 @@
package com.ningxia.yunxi.chemmes.module.biz.dal.mysql.techproc;
import java.util.*;
import cn.hutool.core.util.ObjectUtil;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.ningxia.yunxi.chemmes.framework.common.pojo.PageResult;
import com.ningxia.yunxi.chemmes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.ningxia.yunxi.chemmes.framework.mybatis.core.mapper.BaseMapperX;
import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.storearea.StoreAreaDO;
import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.techproc.TechProcDO;
import com.ningxia.yunxi.chemmes.module.system.dal.dataobject.user.AdminUserDO;
import org.apache.ibatis.annotations.Mapper;
import com.ningxia.yunxi.chemmes.module.biz.controller.admin.techproc.vo.*;
@ -18,9 +21,21 @@ import com.ningxia.yunxi.chemmes.module.biz.controller.admin.techproc.vo.*;
public interface TechProcMapper extends BaseMapperX<TechProcDO> {
default PageResult<TechProcDO> selectPage(TechProcPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<TechProcDO>()
.eqIfPresent(TechProcDO::getEnabledStatus, reqVO.getEnabledStatus())
.orderByDesc(TechProcDO::getId));
MPJLambdaWrapper<TechProcDO> query = new MPJLambdaWrapper<>();
query.selectAll(TechProcDO.class)
.select("u.nickname as nickname")
.leftJoin(AdminUserDO.class, "u",AdminUserDO::getId,TechProcDO::getCreator)
.disableSubLogicDel();
query.eq(ObjectUtil.isNotEmpty( reqVO.getEnabledStatus()),TechProcDO::getEnabledStatus, reqVO.getEnabledStatus());
return selectPage(reqVO, query);
}
default Long selectByTechProcCount(String techProc, Integer id){
return selectCount(new MPJLambdaWrapper<TechProcDO>()
.eq(TechProcDO::getTechProc, techProc)
.eq(TechProcDO::getId, id)
);
}
}

View File

@ -6,11 +6,16 @@ import com.ningxia.yunxi.chemmes.module.biz.controller.admin.checkitem.vo.CheckI
import com.ningxia.yunxi.chemmes.module.biz.controller.admin.checkitem.vo.CheckItemSaveReqVO;
import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.checkitem.CheckItemDO;
import com.ningxia.yunxi.chemmes.module.biz.dal.mysql.checkitem.CheckItemMapper;
import com.ningxia.yunxi.chemmes.module.biz.dal.mysql.inspplanitem.InspPlanItemMapper;
import com.ningxia.yunxi.chemmes.module.system.dal.dataobject.dict.DictDataDO;
import com.ningxia.yunxi.chemmes.module.system.dal.mysql.dict.DictDataMapper;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import static com.ningxia.yunxi.chemmes.framework.common.exception.util.ServiceExceptionUtil.exception;
/**
* 检验项目 Service 实现类
*
@ -22,9 +27,15 @@ public class CheckItemServiceImpl implements CheckItemService {
@Resource
private CheckItemMapper checkItemMapper;
@Resource
private InspPlanItemMapper inspPlanItemMapper;
@Resource
private DictDataMapper dictDataMapper;
@Override
public Integer createCheckItem(CheckItemSaveReqVO createReqVO) {
// 校验同类下检验项名称不重复
validateItemNameUnique(null, createReqVO.getItemType(), createReqVO.getItemName());
// 插入
CheckItemDO checkItem = BeanUtils.toBean(createReqVO, CheckItemDO.class);
checkItemMapper.insert(checkItem);
@ -36,6 +47,8 @@ public class CheckItemServiceImpl implements CheckItemService {
public void updateCheckItem(CheckItemSaveReqVO updateReqVO) {
// 校验存在
validateCheckItemExists(updateReqVO.getId());
// 校验同类下检验项名称不重复
validateItemNameUnique(updateReqVO.getId(), updateReqVO.getItemType(), updateReqVO.getItemName());
// 更新
CheckItemDO updateObj = BeanUtils.toBean(updateReqVO, CheckItemDO.class);
checkItemMapper.updateById(updateObj);
@ -43,18 +56,42 @@ public class CheckItemServiceImpl implements CheckItemService {
@Override
public void deleteCheckItem(Integer id) {
// 校验存在
validateCheckItemExists(id);
Long count = inspPlanItemMapper.selectByItemIdCount(id);
if (count > 0) {
throw exception("该检验标准已做质检方案,不允许删除,请确认。");
}
// 删除
checkItemMapper.deleteById(id);
}
private void validateCheckItemExists(Integer id) {
if (checkItemMapper.selectById(id) == null) {
// throw exception(CHECK_ITEM_NOT_EXISTS);
throw exception("数据不存在");
}
}
/**
* 校验同类下检验项名称不重复
*/
private void validateItemNameUnique(Integer id, String itemType, String itemName) {
Long count = checkItemMapper.selectCountByItemTypeAndItemName(itemType, itemName, id);
if (count > 0) {
String itemTypeName = getItemTypeName(itemType);
throw exception(itemTypeName + "内已存在检验名称为" + itemName + "的检验项,请确认!");
}
}
/**
* 获取适用类型名称
*/
private String getItemTypeName(String itemType) {
DictDataDO dictData = dictDataMapper.selectByDictTypeAndValue("mat_type", itemType);
return dictData != null ? dictData.getLabel() : itemType;
}
@Override
public CheckItemDO getCheckItem(Integer id) {
return checkItemMapper.selectById(id);

View File

@ -56,4 +56,5 @@ public interface ProcService {
List<ProcRespVO> getProcDropdown(String keyWord);
List<ProcRespVO> getProcList();
}

View File

@ -92,4 +92,10 @@ public class ProcServiceImpl implements ProcService {
return BeanUtils.toBean(procDOS, ProcRespVO.class);
}
@Override
public List<ProcRespVO> getProcList() {
List<ProcDO> procDOS = procMapper.getProcList();
return BeanUtils.toBean(procDOS, ProcRespVO.class);
}
}

View File

@ -0,0 +1,55 @@
package com.ningxia.yunxi.chemmes.module.biz.service.storearea;
import java.util.*;
import javax.validation.*;
import com.ningxia.yunxi.chemmes.module.biz.controller.admin.storearea.vo.*;
import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.storearea.StoreAreaDO;
import com.ningxia.yunxi.chemmes.framework.common.pojo.PageResult;
import com.ningxia.yunxi.chemmes.framework.common.pojo.PageParam;
/**
* 库区主数据 Service 接口
*
* @author 管理员
*/
public interface StoreAreaService {
/**
* 创建库区主数据
*
* @param createReqVO 创建信息
* @return 编号
*/
Integer createStoreArea(@Valid StoreAreaSaveReqVO createReqVO);
/**
* 更新库区主数据
*
* @param updateReqVO 更新信息
*/
void updateStoreArea(@Valid StoreAreaSaveReqVO updateReqVO);
/**
* 删除库区主数据
*
* @param id 编号
*/
void deleteStoreArea(Integer id);
/**
* 获得库区主数据
*
* @param id 编号
* @return 库区主数据
*/
StoreAreaDO getStoreArea(Integer id);
/**
* 获得库区主数据分页
*
* @param pageReqVO 分页查询
* @return 库区主数据分页
*/
PageResult<StoreAreaDO> getStoreAreaPage(StoreAreaPageReqVO pageReqVO);
}

View File

@ -0,0 +1,83 @@
package com.ningxia.yunxi.chemmes.module.biz.service.storearea;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import com.ningxia.yunxi.chemmes.module.biz.controller.admin.storearea.vo.*;
import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.storearea.StoreAreaDO;
import com.ningxia.yunxi.chemmes.framework.common.pojo.PageResult;
import com.ningxia.yunxi.chemmes.framework.common.pojo.PageParam;
import com.ningxia.yunxi.chemmes.framework.common.util.object.BeanUtils;
import com.ningxia.yunxi.chemmes.module.biz.dal.mysql.storearea.StoreAreaMapper;
import static com.ningxia.yunxi.chemmes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.ningxia.yunxi.chemmes.module.biz.enums.ErrorCodeConstants.*;
/**
* 库区主数据 Service 实现类
*
* @author 管理员
*/
@Service
@Validated
public class StoreAreaServiceImpl implements StoreAreaService {
@Resource
private StoreAreaMapper storeAreaMapper;
@Override
public Integer createStoreArea(StoreAreaSaveReqVO createReqVO) {
Long count = storeAreaMapper.selectByStoreAreCodeCount(createReqVO.getStoreAreCd(),createReqVO.getId());
if (count > 0) {
throw exception("库区编码已存在,请重新输入!");
}
// 插入
StoreAreaDO storeArea = BeanUtils.toBean(createReqVO, StoreAreaDO.class);
storeAreaMapper.insert(storeArea);
// 返回
return storeArea.getId();
}
@Override
public void updateStoreArea(StoreAreaSaveReqVO updateReqVO) {
Long count = storeAreaMapper.selectByStoreAreCodeCount(updateReqVO.getStoreAreCd(),updateReqVO.getId());
if (count > 0) {
throw exception("库区编码已存在,请重新输入!");
}
// 校验存在
validateStoreAreaExists(updateReqVO.getId());
// 更新
StoreAreaDO updateObj = BeanUtils.toBean(updateReqVO, StoreAreaDO.class);
storeAreaMapper.updateById(updateObj);
}
@Override
public void deleteStoreArea(Integer id) {
// 校验存在
validateStoreAreaExists(id);
// 删除
storeAreaMapper.deleteById(id);
}
private void validateStoreAreaExists(Integer id) {
if (storeAreaMapper.selectById(id) == null) {
throw exception("数据不存在");
}
}
@Override
public StoreAreaDO getStoreArea(Integer id) {
return storeAreaMapper.selectById(id);
}
@Override
public PageResult<StoreAreaDO> getStoreAreaPage(StoreAreaPageReqVO pageReqVO) {
return storeAreaMapper.selectPage(pageReqVO);
}
}

View File

@ -52,4 +52,5 @@ public interface StoreHouseService {
*/
PageResult<StoreHouseDO> getStoreHousePage(StoreHousePageReqVO pageReqVO);
List<StoreHouseDO> getStoreHouseSelect();
}

View File

@ -11,6 +11,10 @@ import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.List;
import static com.ningxia.yunxi.chemmes.framework.common.exception.util.ServiceExceptionUtil.exception;
/**
* 仓储主数据 Service 实现类
*
@ -25,6 +29,11 @@ public class StoreHouseServiceImpl implements StoreHouseService {
@Override
public Integer createStoreHouse(StoreHouseSaveReqVO createReqVO) {
Long count = storeHouseMapper.selectByStoreHouseCodeCount(createReqVO.getStoreHouseCd(),null);
if (count > 0) {
throw exception("仓储编码已存在,请重新输入!");
}
// 插入
StoreHouseDO storeHouse = BeanUtils.toBean(createReqVO, StoreHouseDO.class);
storeHouseMapper.insert(storeHouse);
@ -34,8 +43,12 @@ public class StoreHouseServiceImpl implements StoreHouseService {
@Override
public void updateStoreHouse(StoreHouseSaveReqVO updateReqVO) {
Long count = storeHouseMapper.selectByStoreHouseCodeCount(updateReqVO.getStoreHouseCd(),updateReqVO.getId());
if (count > 0) {
throw exception("仓储编码已存在,请重新输入!");
}
// 校验存在
validateStoreHouseExists(updateReqVO.getId());
// validateStoreHouseExists(updateReqVO.getId());
// 更新
StoreHouseDO updateObj = BeanUtils.toBean(updateReqVO, StoreHouseDO.class);
storeHouseMapper.updateById(updateObj);
@ -51,7 +64,7 @@ public class StoreHouseServiceImpl implements StoreHouseService {
private void validateStoreHouseExists(Integer id) {
if (storeHouseMapper.selectById(id) == null) {
// throw exception(STORE_HOUSE_NOT_EXISTS);
throw exception("数据不存在");
}
}
@ -65,4 +78,9 @@ public class StoreHouseServiceImpl implements StoreHouseService {
return storeHouseMapper.selectPage(pageReqVO);
}
@Override
public List<StoreHouseDO> getStoreHouseSelect() {
return storeHouseMapper.getStoreHouseSelect();
}
}

View File

@ -11,6 +11,8 @@ import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import static com.ningxia.yunxi.chemmes.framework.common.exception.util.ServiceExceptionUtil.exception;
/**
* 工艺流程主数据 Service 实现类
*
@ -25,6 +27,10 @@ public class TechProcServiceImpl implements TechProcService {
@Override
public Integer createTechProc(TechProcSaveReqVO createReqVO) {
Long count = techProcMapper.selectByTechProcCount(createReqVO.getTechProc(),null);
if (count > 0) {
throw exception("工艺流程已存在,请重新选择!");
}
// 插入
TechProcDO techProc = BeanUtils.toBean(createReqVO, TechProcDO.class);
techProcMapper.insert(techProc);
@ -34,6 +40,10 @@ public class TechProcServiceImpl implements TechProcService {
@Override
public void updateTechProc(TechProcSaveReqVO updateReqVO) {
Long count = techProcMapper.selectByTechProcCount(updateReqVO.getTechProc(),updateReqVO.getId());
if (count > 0) {
throw exception("工艺流程已存在,请重新选择!");
}
// 校验存在
validateTechProcExists(updateReqVO.getId());
// 更新
@ -51,7 +61,7 @@ public class TechProcServiceImpl implements TechProcService {
private void validateTechProcExists(Integer id) {
if (techProcMapper.selectById(id) == null) {
// throw exception(TECH_PROC_NOT_EXISTS);
throw exception("数据不存在");
}
}

View File

@ -60,7 +60,7 @@ spring:
redis:
host: 218.95.153.170 # 地址
port: 6379 # 端口
database: 9 # 数据库索引
database: 8 # 数据库索引
password: 'qweasd,.123' # 密码,建议生产环境开启
--- #################### 定时任务相关配置 ####################

View File

@ -59,7 +59,7 @@ spring:
redis:
host: localhost # 地址
port: 6379 # 端口
database: 9 # 数据库索引
database: 8 # 数据库索引
password: 'qweasd,.123' # 密码,建议生产环境开启
--- #################### 定时任务相关配置 ####################

View File

@ -42,3 +42,7 @@ export const exportProc = async (params) => {
export const getProcDropdown = async (params) => {
return await request.get({ url: `/biz/proc/dropdown`, params })
}
// 获取工序下拉列表
export const getProcList = async () => {
return await request.get({ url: `/biz/proc/getProcList` })
}

View File

@ -0,0 +1,42 @@
import request from '@/config/axios'
export interface StoreAreaVO {
id: number
fCreatorUserId: string
storeAreCd: string
storeAreaName: string
enabledStatus: number
remark: string
storeHouseId: number
storeType: string
}
// 查询库区主数据分页
export const getStoreAreaPage = async (params) => {
return await request.get({ url: `/biz/store-area/page`, params })
}
// 查询库区主数据详情
export const getStoreArea = async (id: number) => {
return await request.get({ url: `/biz/store-area/get?id=` + id })
}
// 新增库区主数据
export const createStoreArea = async (data: StoreAreaVO) => {
return await request.post({ url: `/biz/store-area/create`, data })
}
// 修改库区主数据
export const updateStoreArea = async (data: StoreAreaVO) => {
return await request.put({ url: `/biz/store-area/update`, data })
}
// 删除库区主数据
export const deleteStoreArea = async (id: number) => {
return await request.delete({ url: `/biz/store-area/delete?id=` + id })
}
// 导出库区主数据 Excel
export const exportStoreArea = async (params) => {
return await request.download({ url: `/biz/store-area/export-excel`, params })
}

View File

@ -38,3 +38,7 @@ export const deleteStoreHouse = async (id: number) => {
export const exportStoreHouse = async (params) => {
return await request.download({ url: `/biz/store-house/export-excel`, params })
}
//获取仓储主数据下拉列表
export const getStoreHouseSelect = async () => {
return await request.get({ url: `/biz/store-house/get-store-house-select`})
}

View File

@ -131,7 +131,7 @@ export enum DICT_TYPE {
SYSTEM_NOTIFY_TEMPLATE_TYPE = 'system_notify_template_type',
SYSTEM_SOCIAL_TYPE = 'system_social_type',
SYSTEM_STATUS = 'system_status',
SYSTEM_IS_CELL = 'system_is_cell',
SYSTEM_IS_CELL = 'system_is_cell',//是否
// ========== INFRA 模块 ==========
INFRA_BOOLEAN_STRING = 'infra_boolean_string',

View File

@ -1,45 +1,51 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<Dialog :title="dialogTitle" v-model="dialogVisible" width="800px" @close="cancel">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
:rules="formData.itemType=='3'?formRules:formRules1"
label-width="120px"
v-loading="formLoading"
:validate-on-rule-change="false"
:key="formData.itemType"
>
<el-form-item label="检验项编号" prop="itemNo">
<el-input v-model="formData.itemNo" placeholder="请输入检验项编号" />
<el-row :gutter="15">
<el-col :span="12">
<el-form-item label="编号" prop="itemNo">
<el-input v-model="formData.itemNo" placeholder="请输入检验项编号" class="!w-240px"/>
</el-form-item>
<el-form-item label="检验项名称" prop="itemName">
<el-input v-model="formData.itemName" placeholder="请输入检验项名称" />
</el-col>
<el-col :span="12">
<el-form-item label="名称" prop="itemName">
<el-input v-model="formData.itemName" placeholder="请输入名称" class="!w-240px"/>
</el-form-item>
<el-form-item label="性质1 表示定性2 表示定量" prop="nature">
<el-input v-model="formData.nature" placeholder="请输入性质1 表示定性2 表示定量" />
</el-form-item>
<el-form-item label="单位" prop="unitName">
<el-input v-model="formData.unitName" placeholder="请输入单位" />
</el-form-item>
<el-form-item label="检验方法" prop="checkMethod">
<el-input v-model="formData.checkMethod" placeholder="请输入检验方法" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输入备注" />
</el-form-item>
<el-form-item label="适用类型1表示原材料 2表示半成品 3表示成品" prop="itemType">
<el-select v-model="formData.itemType" placeholder="请选择适用类型1表示原材料 2表示半成品 3表示成品">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.MAT_TYPE)"
</el-col>
</el-row>
<el-row :gutter="15">
<el-col :span="12">
<el-form-item label="性质" prop="nature">
<el-radio-group v-model="formData.nature">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.NATURE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="检验大类" prop="itemClass">
<el-input v-model="formData.itemClass" placeholder="请输入检验大类" />
</el-col>
<el-col :span="12">
<el-form-item label="单位" prop="unitName">
<el-input v-model="formData.unitName" placeholder="请输入单位" class="!w-240px"/>
</el-form-item>
<el-form-item label="检验值类型( I -数字 T- 文本)" prop="itemValueType">
<el-select v-model="formData.itemValueType" placeholder="请选择检验值类型( I -数字 T- 文本)">
</el-col>
</el-row>
<el-row :gutter="15">
<el-col :span="12">
<el-form-item label="检验值类型" prop="itemValueType">
<el-select v-model="formData.itemValueType" placeholder="请选择检验值类型" @change="handleItemValueTypeChange">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.TEST_VALUE_TYPE)"
:key="dict.value"
@ -48,30 +54,103 @@
/>
</el-select>
</el-form-item>
<el-form-item label="绑定输入文本(符合,不符合)" prop="itemContent">
<Editor v-model="formData.itemContent" height="150px" />
</el-col>
<el-col :span="12">
<el-form-item label="适用类型" prop="itemType">
<el-select v-model="formData.itemType" placeholder="请选择适用类型" @change="handleItemTypeChange">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.MAT_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="15">
<el-col :span="12">
<el-form-item label="检验值数量" prop="testNum">
<el-input v-model="formData.testNum" placeholder="请输入检验值数量" />
<el-input v-model="formData.testNum" placeholder="请输入检验值数量" class="!w-240px"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="绑定值" prop="itemContent">
<el-input v-model="formData.itemContent" class="!w-240px" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="15">
<el-col :span="12">
<el-form-item label="是否取平均值" prop="printAvgValues">
<el-radio-group v-model="formData.printAvgValues">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.SYSTEM_IS_CELL)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="小数位数" prop="floatNum">
<el-input v-model="formData.floatNum" placeholder="请输入小数位数" />
<el-input v-model="formData.floatNum" placeholder="请输入小数位数" class="!w-240px" />
</el-form-item>
<el-form-item label="打印是否取平均值" prop="printAvgValues">
<el-input v-model="formData.printAvgValues" placeholder="请输入打印是否取平均值" />
</el-col>
</el-row>
<el-row :gutter="15">
<el-col :span="12">
<el-form-item label="检验大类" prop="itemClass">
<el-select v-model="formData.itemClass" placeholder="请选择检验大类" v-if="formData.itemType=='3'">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.FINISHED_PRODUCT_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
<el-select v-model="formData.itemClass" placeholder="请选择检验大类" v-if="formData.itemType=='1'">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.RAW_MATERIALS_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
<el-select v-model="formData.itemClass" placeholder="请选择检验大类" v-if="formData.itemType=='2'||!formData.itemType" disabled/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="15">
<el-col :span="24">
<el-form-item label="检验方法" prop="checkMethod">
<el-input type="textarea" :rows="4" v-model="formData.checkMethod" placeholder="请输入检验方法"/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="15">
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input type="textarea" :rows="4" v-model="formData.remark" placeholder="请输入备注"/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
<el-button @click="cancel"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getStrDictOptions, DICT_TYPE } from '@/utils/dict'
import {getStrDictOptions, DICT_TYPE, getIntDictOptions} from '@/utils/dict'
import * as CheckItemApi from '@/api/biz/checkitem'
const { t } = useI18n() //
const {t} = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
@ -79,22 +158,51 @@ const dialogTitle = ref('') // 弹窗的标题
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
itemNo: undefined,
itemName: undefined,
nature: undefined,
unitName: undefined,
checkMethod: undefined,
remark: undefined,
itemType: undefined,
itemClass: undefined,
itemValueType: undefined,
itemContent: undefined,
testNum: undefined,
floatNum: undefined,
printAvgValues: undefined,
id: undefined as number | undefined,
itemNo: undefined as string | undefined,
itemName: undefined as string | undefined,
nature: undefined as string | undefined,
unitName: undefined as string | undefined,
checkMethod: undefined as string | undefined,
remark: undefined as string | undefined,
itemType: undefined as string | undefined,
itemClass: undefined as string | undefined,
itemValueType: undefined as string | undefined,
itemContent: undefined as string | undefined,
testNum: undefined as string | undefined,
floatNum: undefined as number | string | undefined,
printAvgValues: "0" as string | undefined,
})
const formRules = reactive({
itemName: [
{ required: true, message: '请输入名称', trigger: 'blur' }
],
nature: [
{ required: true, message: '性质不能为空', trigger: 'change' }
],
itemType: [
{ required: true, message: '请选择适用类型', trigger: 'change' }
],
itemContent: [
{ pattern: /^[\w\u4e00-\u9fa5]+(,[\w\u4e00-\u9fa5]+)*$/, message: '格式错误', trigger: 'blur' }
],
itemClass: [
{ required: true, message: '检验大类', trigger: 'change' }
]
})
const formRules1 = reactive({
itemName: [
{ required: true, message: '请输入名称', trigger: 'blur' }
],
nature: [
{ required: true, message: '性质不能为空', trigger: 'change' }
],
itemType: [
{ required: true, message: '请选择适用类型', trigger: 'change' }
],
itemContent: [
{ pattern: /^[\w\u4e00-\u9fa5]+(,[\w\u4e00-\u9fa5]+)*$/, message: '格式错误', trigger: 'blur' }
]
})
const formRef = ref() // Ref
@ -114,13 +222,43 @@ const open = async (type: string, id?: number) => {
}
}
}
defineExpose({ open }) // open
defineExpose({open}) // open
/** 适用类型变化 */
const handleItemTypeChange = () => {
formData.value.itemClass = undefined
}
/** 检验值类型变化 */
const handleItemValueTypeChange = (row: string) => {
if (row === 'I') {
formData.value.floatNum = 2
} else {
formData.value.floatNum = ''
}
}
const cancel = async () => {
dialogVisible.value = false
emit('success')
}
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
if (formData.value.itemValueType === 'I' && formData.value.itemContent != null && formData.value.itemContent !== '') {
message.error('检验值类型为数字类型,绑定值必须为空,请确认')
return
}
if (formData.value.itemValueType === 'T' && formData.value.floatNum != null && formData.value.floatNum !== '') {
message.error('检验值类型为文本类型,小数位数必须为空,请确认')
return
}
if (formData.value.itemValueType === 'I' && (formData.value.floatNum == null || formData.value.floatNum === '')) {
message.error('检验值类型为数字类型,小数位数必须输入,请确认')
return
}
//
formLoading.value = true
try {
@ -156,7 +294,7 @@ const resetForm = () => {
itemContent: undefined,
testNum: undefined,
floatNum: undefined,
printAvgValues: undefined,
printAvgValues: "0",
}
formRef.value?.resetFields()
}

View File

@ -6,57 +6,12 @@
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
label-width="80px"
>
<el-form-item label="检验项名称" prop="itemName">
<el-input
v-model="queryParams.itemName"
placeholder="请输入检验项名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="性质1 表示定性2 表示定量" prop="nature">
<el-input
v-model="queryParams.nature"
placeholder="请输入性质1 表示定性2 表示定量"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="单位" prop="unitName">
<el-input
v-model="queryParams.unitName"
placeholder="请输入单位"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="检验方法" prop="checkMethod">
<el-input
v-model="queryParams.checkMethod"
placeholder="请输入检验方法"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input
v-model="queryParams.remark"
placeholder="请输入备注"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="适用类型1表示原材料 2表示半成品 3表示成品" prop="itemType">
<el-form-item label="适用类型" prop="itemType">
<el-select
v-model="queryParams.itemType"
placeholder="请选择适用类型1表示原材料 2表示半成品 3表示成品"
placeholder="请选择适用类型"
clearable
class="!w-240px"
>
@ -68,52 +23,19 @@
/>
</el-select>
</el-form-item>
<el-form-item label="检验大类" prop="itemClass">
<el-form-item label="编号" prop="itemNo">
<el-input
v-model="queryParams.itemClass"
placeholder="请输入检验大类"
v-model="queryParams.itemNo"
placeholder="请输入编号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="检验值类型( I -数字 T- 文本)" prop="itemValueType">
<el-select
v-model="queryParams.itemValueType"
placeholder="请选择检验值类型( I -数字 T- 文本)"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.TEST_VALUE_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="检验值数量" prop="testNum">
<el-form-item label="检验名称" prop="itemName">
<el-input
v-model="queryParams.testNum"
placeholder="请输入检验值数量"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="小数位数" prop="floatNum">
<el-input
v-model="queryParams.floatNum"
placeholder="请输入小数位数"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="打印是否取平均值" prop="printAvgValues">
<el-input
v-model="queryParams.printAvgValues"
placeholder="请输入打印是否取平均值"
v-model="queryParams.itemName"
placeholder="请输入检验名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
@ -130,62 +52,51 @@
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['biz:check-item:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="自增字段" align="center" prop="id" />
<el-table-column label="检验项编号" align="center" prop="itemNo" />
<el-table-column label="检验项名称" align="center" prop="itemName" />
<el-table-column label="性质1 表示定性2 表示定量" align="center" prop="nature">
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" border>
<el-table-column type="index" label="序号" align="center" min-width="60" />
<el-table-column label="名称" align="center" prop="itemName" width="180"/>
<el-table-column label="性质" align="center" prop="nature" width="120">
<template #default="scope">
<dict-tag :type="DICT_TYPE.NATURE" :value="scope.row.nature" />
</template>
</el-table-column>
<el-table-column label="单位" align="center" prop="unitName" />
<el-table-column label="检验方法" align="center" prop="checkMethod" />
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="适用类型1表示原材料 2表示半成品 3表示成品" align="center" prop="itemType">
<el-table-column label="检验大类" align="center" prop="itemClass" width="120">
<template #default="scope">
<dict-tag :type="DICT_TYPE.RAW_MATERIALS_TYPE" :value="scope.row.itemType" v-if="scope.row.itemType==1"/>
<dict-tag :type="DICT_TYPE.FINISHED_PRODUCT_TYPE" :value="scope.row.itemType" v-if="scope.row.itemType==3"/>
<span v-if="scope.row.itemType!=1 && scope.row.itemType!=3"></span>
</template>
</el-table-column>
<el-table-column label="单位" align="center" prop="unitName" width="120"/>
<el-table-column label="检验方法" align="center" prop="checkMethod" width="200"/>
<el-table-column label="适用类型" align="center" prop="itemType" width="120">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MAT_TYPE" :value="scope.row.itemType" />
</template>
</el-table-column>
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="检验大类" align="center" prop="itemClass" />
<el-table-column label="检验值类型( I -数字 T- 文本)" align="center" prop="itemValueType">
<el-table-column label="检验值类型" align="center" prop="itemValueType" width="120">
<template #default="scope">
<dict-tag :type="DICT_TYPE.TEST_VALUE_TYPE" :value="scope.row.itemValueType" />
</template>
</el-table-column>
<el-table-column label="绑定输入文本(符合,不符合)" align="center" prop="itemContent" />
<el-table-column label="检验值数量" align="center" prop="testNum" />
<el-table-column label="小数位数" align="center" prop="floatNum" />
<el-table-column label="打印是否取平均值" align="center" prop="printAvgValues" />
<el-table-column label="操作" align="center">
<el-table-column label="检验值数量" align="center" prop="testNum" width="120"/>
<el-table-column label="绑定值" align="center" prop="itemContent" width="200"/>
<el-table-column label="小数位数" align="center" prop="floatNum" width="120" />
<el-table-column label="备注" align="center" prop="remark" width="200"/>
<el-table-column label="编号" align="center" prop="itemNo" />
<el-table-column label="操作" align="center" width="120" fixed="right">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['biz:check-item:update']"
>
编辑
</el-button>
@ -193,14 +104,13 @@
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['biz:check-item:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
@ -215,8 +125,6 @@
<script setup lang="ts">
import { getStrDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import * as CheckItemApi from '@/api/biz/checkitem'
import CheckItemForm from './CheckItemForm.vue'
@ -225,7 +133,7 @@ defineOptions({ name: 'CheckItem' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const loading = ref(false) //
const list = ref([]) //
const total = ref(0) //
const queryParams = reactive({
@ -243,9 +151,9 @@ const queryParams = reactive({
testNum: undefined,
floatNum: undefined,
printAvgValues: undefined,
itemNo:undefined,
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
@ -290,23 +198,10 @@ const handleDelete = async (id: number) => {
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await CheckItemApi.exportCheckItem(queryParams)
download.excel(data, '检验项目.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
// getList()
})
</script>

View File

@ -0,0 +1,151 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
@close="cancel"
>
<el-form-item label="仓库" prop="storeHouseId">
<el-select class="!w-240px" v-model="formData.storeHouseId" clearable filterable @change="handleStoreHouseChange">
<el-option
v-for="dict in storeHouseList"
:key="dict.id"
:label="dict.storeHouseName"
:value="dict.id"
/>
</el-select> </el-form-item>
<el-form-item label="库区编码" prop="storeAreCd">
<el-input v-model="formData.storeAreCd" placeholder="请输入库区编码" class="!w-240px" :disabled="formData.id"/>
</el-form-item>
<el-form-item label="库区名称" prop="storeAreaName">
<el-input v-model="formData.storeAreaName" placeholder="请输入库区名称" class="!w-240px"/>
</el-form-item>
<el-form-item label="状态" prop="enabledStatus">
<el-select v-model="formData.enabledStatus" placeholder="请选择状态">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input type='textarea' :rows="4" v-model="formData.remark" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="cancel"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import * as StoreAreaApi from '@/api/biz/storearea'
import * as StoreHouseApi from '@/api/biz/storehouse'
const { t } = useI18n() //
const message = useMessage() //
const storeHouseList = ref()
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
fCreatorUserId: undefined,
storeAreCd: undefined,
storeAreaName: undefined,
enabledStatus: 0,
remark: undefined,
storeHouseId: undefined,
storeType: undefined,
})
const formRules = reactive({
storeHouseId: [{ required: true, message: '仓库不能为空', trigger: 'change' }],
storeAreCd: [{ required: true, message: '库区编码不能为空', trigger: 'blur' }],
storeAreaName: [{ required: true, message: '库区名称不能为空', trigger: 'blur' }],
enabledStatus: [{ required: true, message: '状态不能为空', trigger: 'change' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
storeHouseList.value = await StoreHouseApi.getStoreHouseSelect()
//
if (id) {
formLoading.value = true
try {
formData.value = await StoreAreaApi.getStoreArea(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
const cancel = async () => {
dialogVisible.value = false
emit('success')
}
/** 仓库选择变化事件 */
const handleStoreHouseChange = (storeHouseId: number) => {
if (!storeHouseId) {
formData.value.storeType = undefined
return
}
const selectedStore = storeHouseList.value.find((item: any) => item.id === storeHouseId)
if (selectedStore) {
formData.value.storeType = selectedStore.storeType
}
}
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as StoreAreaApi.StoreAreaVO
if (formType.value === 'create') {
await StoreAreaApi.createStoreArea(data)
message.success(t('common.createSuccess'))
} else {
await StoreAreaApi.updateStoreArea(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
fCreatorUserId: undefined,
storeAreCd: undefined,
storeAreaName: undefined,
enabledStatus: 0,
remark: undefined,
storeHouseId: undefined,
storeType: undefined,
}
formRef.value?.resetFields()
}
</script>

View File

@ -0,0 +1,202 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="80px"
>
<el-form-item label="仓库类型" prop="storeType">
<el-select
v-model="queryParams.storeType"
placeholder="请选择仓库类型"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.WAREHOUSE_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="仓库名称" prop="storeHouseName">
<el-input
v-model="queryParams.storeHouseName"
placeholder="请输入仓库名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="状态" prop="enabledStatus">
<el-select
v-model="queryParams.enabledStatus"
placeholder="请选择状态"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" border>
<el-table-column type="index" label="序号" align="center" min-width="60" />
<el-table-column label="仓库名称" align="center" prop="storeHouseName" />
<el-table-column label="仓库类型" align="center" prop="storeType" >
<template #default="scope">
<dict-tag :type="DICT_TYPE.WAREHOUSE_TYPE" :value="scope.row.storeType" />
</template>
</el-table-column>
<el-table-column label="库区编码" align="center" prop="storeAreCd" />
<el-table-column label="库区名称" align="center" prop="storeAreaName" />
<el-table-column label="状态" align="center" prop="enabledStatus">
<template #default="scope">
<dict-tag :type="DICT_TYPE.SYSTEM_STATUS" :value="scope.row.enabledStatus" />
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter2"
width="180px"
/>
<el-table-column label="操作" align="center">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
>
编辑
</el-button>
<!-- <el-button-->
<!-- link-->
<!-- type="danger"-->
<!-- @click="handleDelete(scope.row.id)"-->
<!-- v-hasPermi="['biz:store-area:delete']"-->
<!-- >-->
<!-- 删除-->
<!-- </el-button>-->
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<StoreAreaForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter2} from '@/utils/formatTime'
import * as StoreAreaApi from '@/api/biz/storearea'
import StoreAreaForm from './StoreAreaForm.vue'
defineOptions({ name: 'StoreArea' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(false) //
const list = ref([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
fCreatorUserId: undefined,
createTime: [],
storeAreCd: undefined,
storeAreaName: undefined,
enabledStatus: undefined,
remark: undefined,
storeHouseId: undefined,
storeType: undefined,
storeHouseName:undefined
})
const queryFormRef = ref() //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await StoreAreaApi.getStoreAreaPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
// const handleDelete = async (id: number) => {
// try {
// //
// await message.delConfirm()
// //
// await StoreAreaApi.deleteStoreArea(id)
// message.success(t('common.delSuccess'))
// //
// await getList()
// } catch {}
// }
/** 初始化 **/
onMounted(() => {
// getList()
})
</script>

View File

@ -1,5 +1,5 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<Dialog :title="dialogTitle" v-model="dialogVisible" @close="cancel">
<el-form
ref="formRef"
:model="formData"
@ -7,28 +7,8 @@
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="仓储编码" prop="storeHouseCd">
<el-input v-model="formData.storeHouseCd" placeholder="请输入仓储编码" />
</el-form-item>
<el-form-item label="仓储名称" prop="storeHouseName">
<el-input v-model="formData.storeHouseName" placeholder="请输入仓储名称" />
</el-form-item>
<el-form-item label="状态(1启用 2 未启用)" prop="enabledStatus">
<el-radio-group v-model="formData.enabledStatus">
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_STATUS)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输入备注" />
</el-form-item>
<el-form-item label="仓库类型(1 原料库 2 在制品库 3 成品库)" prop="storeType">
<el-select v-model="formData.storeType" placeholder="请选择仓库类型(1 原料库 2 在制品库 3 成品库)">
<el-form-item label="仓库类型" prop="storeType">
<el-select v-model="formData.storeType" placeholder="请选择仓库类型">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.WAREHOUSE_TYPE)"
:key="dict.value"
@ -37,15 +17,38 @@
/>
</el-select>
</el-form-item>
<el-form-item label="仓储编码" prop="storeHouseCd">
<el-input v-model="formData.storeHouseCd" placeholder="请输入仓储编码" class="!w-240px" :disabled="formData.id"/>
</el-form-item>
<el-form-item label="仓储名称" prop="storeHouseName">
<el-input v-model="formData.storeHouseName" placeholder="请输入仓储名称" class="!w-240px" />
</el-form-item>
<el-form-item label="状态" prop="enabledStatus">
<el-select v-model="formData.enabledStatus" placeholder="请选择状态">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input type="textarea" :rows="4" v-model="formData.remark" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
<el-button @click="cancel"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getIntDictOptions, getStrDictOptions, DICT_TYPE } from '@/utils/dict'
import {getStrDictOptions, DICT_TYPE, getIntDictOptions} from '@/utils/dict'
import * as StoreHouseApi from '@/api/biz/storehouse'
const { t } = useI18n() //
@ -59,11 +62,15 @@ const formData = ref({
id: undefined,
storeHouseCd: undefined,
storeHouseName: undefined,
enabledStatus: undefined,
enabledStatus: 0,
remark: undefined,
storeType: undefined,
})
const formRules = reactive({
storeType: [{ required: true, message: '仓库类型不能为空', trigger: 'change' }],
storeHouseCd: [{ required: true, message: '仓储编码不能为空', trigger: 'blur' }],
storeHouseName: [{ required: true, message: '仓储名称不能为空', trigger: 'blur' }],
enabledStatus: [{ required: true, message: '状态不能为空', trigger: 'change' }]
})
const formRef = ref() // Ref
@ -84,7 +91,11 @@ const open = async (type: string, id?: number) => {
}
}
defineExpose({ open }) // open
const cancel = async () => {
dialogVisible.value = false
emit('success')
}
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
@ -115,7 +126,7 @@ const resetForm = () => {
id: undefined,
storeHouseCd: undefined,
storeHouseName: undefined,
enabledStatus: undefined,
enabledStatus: 0,
remark: undefined,
storeType: undefined,
}

View File

@ -6,21 +6,27 @@
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
label-width="80px"
>
<el-form-item label="仓储名称" prop="storeHouseName">
<el-input
v-model="queryParams.storeHouseName"
placeholder="请输入仓储名称"
<el-form-item label="仓库类型" prop="storeType">
<el-select
v-model="queryParams.storeType"
placeholder="请选择仓库类型"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.WAREHOUSE_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="状态(1启用 2 未启用)" prop="enabledStatus">
<el-form-item label="状态" prop="enabledStatus">
<el-select
v-model="queryParams.enabledStatus"
placeholder="请选择状态(1启用 2 未启用)"
placeholder="请选择状态"
clearable
class="!w-240px"
>
@ -39,65 +45,55 @@
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['biz:store-house:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['biz:store-house:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="自增字段" align="center" prop="id" />
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" border>
<el-table-column type="index" label="序号" align="center" min-width="60" />
<el-table-column label="仓库类型" align="center" prop="storeType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.WAREHOUSE_TYPE" :value="scope.row.storeType" />
</template>
</el-table-column>
<el-table-column label="仓储编码" align="center" prop="storeHouseCd" />
<el-table-column label="仓储名称" align="center" prop="storeHouseName" />
<el-table-column label="状态(1启用 2 未启用)" align="center" prop="enabledStatus">
<el-table-column label="状态" align="center" prop="enabledStatus">
<template #default="scope">
<dict-tag :type="DICT_TYPE.SYSTEM_STATUS" :value="scope.row.enabledStatus" />
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="仓库类型(1 原料库 2 在制品库 3 成品库)" align="center" prop="storeType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.WAREHOUSE_TYPE" :value="scope.row.storeType" />
</template>
</el-table-column>
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter2"
width="180px"
/>
<el-table-column label="操作" align="center">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['biz:store-house:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['biz:store-house:delete']"
>
删除
</el-button>
<!-- <el-button-->
<!-- link-->
<!-- type="danger"-->
<!-- @click="handleDelete(scope.row.id)"-->
<!-- v-hasPermi="['biz:store-house:delete']"-->
<!-- >-->
<!-- 删除-->
<!-- </el-button>-->
</template>
</el-table-column>
</el-table>
@ -116,8 +112,7 @@
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { dateFormatter2} from '@/utils/formatTime'
import * as StoreHouseApi from '@/api/biz/storehouse'
import StoreHouseForm from './StoreHouseForm.vue'
@ -126,17 +121,17 @@ defineOptions({ name: 'StoreHouse' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const loading = ref(false) //
const list = ref([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
storeHouseName: undefined,
storeType: undefined,
enabledStatus: undefined,
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
@ -181,23 +176,10 @@ const handleDelete = async (id: number) => {
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await StoreHouseApi.exportStoreHouse(queryParams)
download.excel(data, '仓储主数据.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
// getList()
})
</script>

View File

@ -1,57 +1,91 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<Dialog :title="dialogTitle" v-model="dialogVisible" width="1200" @close="cancel">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="工艺流程" prop="techProc">
<el-input v-model="formData.techProc" placeholder="请输入工艺流程" />
<el-input v-model="techProcDisplay" placeholder="请输入工艺流程" />
</el-form-item>
<el-form-item label="状态(1启用 2 未启用)" prop="enabledStatus">
<el-radio-group v-model="formData.enabledStatus">
<el-radio
<el-form-item label="状态" prop="enabledStatus">
<el-select v-model="formData.enabledStatus" placeholder="请选择状态">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_STATUS)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输入备注" />
<el-input type="textarea" :rows="4" v-model="formData.remark" placeholder="请输入备注" />
</el-form-item>
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">工序信息</span>
</template>
<el-row>
<el-col>
<el-card class="hl-incard">
<el-form ref="OrderYsDetailSubFormRef" :model="procList" label-width="0" >
<el-table ref="procTable" :data="procList" class="hl-table" @selection-change="handleProcSelectionChange" border>
<el-table-column type="selection" width="55"/>
<el-table-column prop="procCd" label="工序编码" align="center"/>
<el-table-column prop="procName" label="工序名称" align="center"/>
<el-table-column prop="remark" label="备注" align="center"/>
<el-table-column prop="creatorName" label="创建人" align="center"/>
<el-table-column prop="createTime" label="创建时间" align="center" :formatter="dateFormatter2"/>
</el-table>
</el-form>
</el-card>
</el-col>
</el-row>
</el-card>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
<el-button @click="cancel"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import * as TechProcApi from '@/api/biz/techproc'
import { dateFormatter2 } from '@/utils/formatTime'
import * as ProcApi from '@/api/biz/proc'
import { nextTick } from 'vue'
const { t } = useI18n() //
const message = useMessage() //
const procList = ref<ProcApi.ProcVO[]>([])
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formLoading = ref(false)
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
techProc: undefined,
enabledStatus: undefined,
remark: undefined,
id: undefined as number | undefined,
techProc: undefined as string | undefined,
enabledStatus: 0 as number,
remark: undefined as string | undefined,
procList: undefined as string[] | undefined,
})
const formRules = reactive({
techProc: [{ required: true, message: '工艺流程不能为空', trigger: 'blur' }],
enabledStatus: [{ required: true, message: '状态不能为空', trigger: 'change' }]
})
const formRef = ref() // Ref
const procTable = ref() // Ref
const selectedProcs = ref<ProcApi.ProcVO[]>([]) //
const techProcDisplay = ref('') //
const PROC_SEPARATOR = '-'
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
@ -59,17 +93,81 @@ const open = async (type: string, id?: number) => {
formType.value = type
resetForm()
//
procList.value=await ProcApi.getProcList()
if (id) {
formLoading.value = true
try {
formData.value = await TechProcApi.getTechProc(id)
//
techProcDisplay.value = convertCodeToName(formData.value.techProc)
//
setSelectedRows(formData.value.techProc)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
}
defineExpose({ open }) // opensetSelectedRows
const cancel = async () => {
dialogVisible.value = false
emit('success')
}
/** 工序编码转名称 */
const convertCodeToName = (codeStr: string | undefined) => {
if (!codeStr) {
return ''
}
const codes = codeStr.split(PROC_SEPARATOR)
const names = codes.map(code => {
const proc = procList.value.find(item => item.procCd === code)
return proc ? proc.procName : code
})
return names.join(PROC_SEPARATOR)
}
/** 工序选择变化处理 - 按列表顺序排列 */
const handleProcSelectionChange = (rows: ProcApi.ProcVO[]) => {
selectedProcs.value = rows
//
const selectedCodes = new Set(rows.map(item => item.procCd))
//
const sortedSelected = procList.value.filter(item => selectedCodes.has(item.procCd))
//
techProcDisplay.value = sortedSelected.map(item => item.procName).join(PROC_SEPARATOR)
//
formData.value.techProc = sortedSelected.map(item => item.procCd).join(PROC_SEPARATOR)
//
formData.value.procList = sortedSelected.map(item => item.procCd)
}
/** 设置表格选中行 */
const setSelectedRows = (procCodes) => {
if (!procCodes || !procTable.value || procList.value.length === 0) {
return
}
let codes: string[] = []
if (Array.isArray(procCodes)) {
if (procCodes.length > 0 && typeof procCodes[0] === 'object') {
codes = procCodes.map((item: any) => item.procCd || item.id || item)
} else {
codes = procCodes
}
} else if (typeof procCodes === 'string') {
codes = procCodes.split(PROC_SEPARATOR)
}
procTable.value.clearSelection()
if (codes.length > 0) {
const codeSet = new Set(codes.map(c => String(c)))
const rows = procList.value.filter(item => codeSet.has(String(item.procCd)))
selectedProcs.value = rows
nextTick(() => {
rows.forEach(row => {
procTable.value.toggleRowSelection(row, true)
})
})
}
}
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
@ -99,9 +197,11 @@ const resetForm = () => {
formData.value = {
id: undefined,
techProc: undefined,
enabledStatus: undefined,
enabledStatus: 0,
remark: undefined,
procList: undefined,
}
techProcDisplay.value = ''
formRef.value?.resetFields()
}
</script>

View File

@ -8,10 +8,10 @@
:inline="true"
label-width="68px"
>
<el-form-item label="状态(1启用 2 未启用)" prop="enabledStatus">
<el-form-item label="状态" prop="enabledStatus">
<el-select
v-model="queryParams.enabledStatus"
placeholder="请选择状态(1启用 2 未启用)"
placeholder="请选择状态"
clearable
class="!w-240px"
>
@ -34,55 +34,44 @@
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['biz:tech-proc:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="自增字段" align="center" prop="id" />
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="工艺流程" align="center" prop="techProc" />
<el-table-column label="状态(1启用 2 未启用)" align="center" prop="enabledStatus">
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" border>
<el-table-column type="index" label="序号" align="center" min-width="60" />
<el-table-column label="工艺流程" align="center" prop="techProcDisplay" width="300px"/>
<el-table-column label="状态" align="center" prop="enabledStatus" width="100px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.SYSTEM_STATUS" :value="scope.row.enabledStatus" />
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="操作" align="center">
<el-table-column
label="创建人"
align="center"
prop="nickname"
width="100px"
/>
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter2" width="120px"
/>
<el-table-column label="操作" align="center" width="100px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['biz:tech-proc:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['biz:tech-proc:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
@ -101,18 +90,21 @@
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { dateFormatter2} from '@/utils/formatTime'
import * as TechProcApi from '@/api/biz/techproc'
import TechProcForm from './TechProcForm.vue'
import * as ProcApi from "@/api/biz/proc";
interface TechProcVOWithDisplay extends TechProcApi.TechProcVO {
techProcDisplay?: string
}
defineOptions({ name: 'TechProc' })
const message = useMessage() //
const { t } = useI18n() //
const procList = ref<ProcApi.ProcVO[]>([])
const loading = ref(true) //
const list = ref([]) //
const loading = ref(false) //
const list = ref<TechProcVOWithDisplay[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
@ -120,7 +112,7 @@ const queryParams = reactive({
enabledStatus: undefined,
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
const PROC_SEPARATOR = '-'
/** 查询列表 */
const getList = async () => {
@ -128,12 +120,26 @@ const getList = async () => {
try {
const data = await TechProcApi.getTechProcPage(queryParams)
list.value = data.list
list.value.forEach(item=>{
item.techProcDisplay=convertCodeToName(item.techProc)
})
total.value = data.total
} finally {
loading.value = false
}
}
/** 工序编码转名称 */
const convertCodeToName = (codeStr: string | undefined) => {
if (!codeStr) {
return ''
}
const codes = codeStr.split(PROC_SEPARATOR)
const names = codes.map(code => {
const proc = procList.value.find(item => item.procCd === code)
return proc ? proc.procName : code
})
return names.join(PROC_SEPARATOR)
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
@ -152,36 +158,13 @@ const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await TechProcApi.deleteTechProc(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await TechProcApi.exportTechProc(queryParams)
download.excel(data, '工艺流程主数据.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
onMounted(async () => {
// getList()
procList.value=await ProcApi.getProcList()
})
</script>