feat(新增基础数据判断规程、以及判定规程明细):
| | |
| | | **/logs |
| | | **/target |
| | | **/.vscode |
| | | **/.flattened-pom.xml |
| | | **/.flattened-pom.xml |
| | | RuoYi-Vue-Plus/.msp |
| | | RuoYi-Vue-Plus/gzdams |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.dromara.qa.qm.controller; |
| | | |
| | | import java.util.List; |
| | | |
| | | import lombok.RequiredArgsConstructor; |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import jakarta.validation.constraints.*; |
| | | import cn.dev33.satoken.annotation.SaCheckPermission; |
| | | import org.springframework.web.bind.annotation.*; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.dromara.common.idempotent.annotation.RepeatSubmit; |
| | | import org.dromara.common.log.annotation.Log; |
| | | import org.dromara.common.web.core.BaseController; |
| | | import org.dromara.common.mybatis.core.page.PageQuery; |
| | | import org.dromara.common.core.domain.R; |
| | | import org.dromara.common.core.validate.AddGroup; |
| | | import org.dromara.common.core.validate.EditGroup; |
| | | import org.dromara.common.log.enums.BusinessType; |
| | | import org.dromara.common.excel.utils.ExcelUtil; |
| | | import org.dromara.qa.qm.domain.vo.QmCheckitemVo; |
| | | import org.dromara.qa.qm.domain.bo.QmCheckitemBo; |
| | | import org.dromara.qa.qm.service.IQmCheckitemService; |
| | | import org.dromara.common.mybatis.core.page.TableDataInfo; |
| | | |
| | | /** |
| | | * è§ç¨æ£éªé¡¹ç® |
| | | * |
| | | * @author zhuguifei |
| | | * @date 2026-03-12 |
| | | */ |
| | | @Validated |
| | | @RequiredArgsConstructor |
| | | @RestController |
| | | @RequestMapping("/qm/checkitem") |
| | | public class QmCheckitemController extends BaseController { |
| | | |
| | | private final IQmCheckitemService qmCheckitemService; |
| | | |
| | | /** |
| | | * æ¥è¯¢è§ç¨æ£éªé¡¹ç®å表 |
| | | */ |
| | | @SaCheckPermission("qm:checkitem:list") |
| | | @GetMapping("/list") |
| | | public TableDataInfo<QmCheckitemVo> list(QmCheckitemBo bo, PageQuery pageQuery) { |
| | | return qmCheckitemService.queryPageList(bo, pageQuery); |
| | | } |
| | | |
| | | @SaCheckPermission("qm:checkitem:list") |
| | | @GetMapping("/tree") |
| | | public TableDataInfo<QmCheckitemVo> tree(@RequestParam @NotBlank(message = "stdCodeä¸è½ä¸ºç©º") String stdCode, |
| | | @RequestParam(required = false) Integer page, |
| | | @RequestParam(required = false) Integer rows) { |
| | | List<QmCheckitemVo> list = qmCheckitemService.queryTreeListByStdCode(stdCode); |
| | | return TableDataInfo.build(list); |
| | | } |
| | | |
| | | /** |
| | | * 导åºè§ç¨æ£éªé¡¹ç®å表 |
| | | */ |
| | | @SaCheckPermission("qm:checkitem:export") |
| | | @Log(title = "è§ç¨æ£éªé¡¹ç®", businessType = BusinessType.EXPORT) |
| | | @PostMapping("/export") |
| | | public void export(QmCheckitemBo bo, HttpServletResponse response) { |
| | | List<QmCheckitemVo> list = qmCheckitemService.queryList(bo); |
| | | ExcelUtil.exportExcel(list, "è§ç¨æ£éªé¡¹ç®", QmCheckitemVo.class, response); |
| | | } |
| | | |
| | | /** |
| | | * è·åè§ç¨æ£éªé¡¹ç®è¯¦ç»ä¿¡æ¯ |
| | | * |
| | | * @param id ä¸»é® |
| | | */ |
| | | @SaCheckPermission("qm:checkitem:query") |
| | | @GetMapping("/{id}") |
| | | public R<QmCheckitemVo> getInfo(@NotNull(message = "主é®ä¸è½ä¸ºç©º") |
| | | @PathVariable String id) { |
| | | return R.ok(qmCheckitemService.queryById(id)); |
| | | } |
| | | |
| | | /** |
| | | * æ°å¢è§ç¨æ£éªé¡¹ç® |
| | | */ |
| | | @SaCheckPermission("qm:checkitem:add") |
| | | @Log(title = "è§ç¨æ£éªé¡¹ç®", businessType = BusinessType.INSERT) |
| | | @RepeatSubmit() |
| | | @PostMapping() |
| | | public R<Void> add(@Validated(AddGroup.class) @RequestBody QmCheckitemBo bo) { |
| | | return toAjax(qmCheckitemService.insertByBo(bo)); |
| | | } |
| | | |
| | | /** |
| | | * ä¿®æ¹è§ç¨æ£éªé¡¹ç® |
| | | */ |
| | | @SaCheckPermission("qm:checkitem:edit") |
| | | @Log(title = "è§ç¨æ£éªé¡¹ç®", businessType = BusinessType.UPDATE) |
| | | @RepeatSubmit() |
| | | @PutMapping() |
| | | public R<Void> edit(@Validated(EditGroup.class) @RequestBody QmCheckitemBo bo) { |
| | | return toAjax(qmCheckitemService.updateByBo(bo)); |
| | | } |
| | | |
| | | /** |
| | | * å é¤è§ç¨æ£éªé¡¹ç® |
| | | * |
| | | * @param ids 主é®ä¸² |
| | | */ |
| | | @SaCheckPermission("qm:checkitem:remove") |
| | | @Log(title = "è§ç¨æ£éªé¡¹ç®", businessType = BusinessType.DELETE) |
| | | @DeleteMapping("/{ids}") |
| | | public R<Void> remove(@NotEmpty(message = "主é®ä¸è½ä¸ºç©º") |
| | | @PathVariable String[] ids) { |
| | | return toAjax(qmCheckitemService.deleteWithValidByIds(List.of(ids), true)); |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.dromara.qa.qm.domain; |
| | | |
| | | import org.dromara.common.mybatis.core.domain.BaseEntity; |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | | import java.io.Serial; |
| | | |
| | | /** |
| | | * è§ç¨æ£éªé¡¹ç®å¯¹è±¡ qm_checkitem |
| | | * |
| | | * @author zhuguifei |
| | | * @date 2026-03-12 |
| | | */ |
| | | @Data |
| | | @TableName("qm_checkitem") |
| | | public class QmCheckitem { |
| | | |
| | | @Serial |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** |
| | | * ç¼ç |
| | | */ |
| | | @TableId(value = "id") |
| | | private String id; |
| | | |
| | | /** |
| | | * æ£éªé¡¹ç®ä»£ç |
| | | */ |
| | | private String itemCode; |
| | | |
| | | /** |
| | | * æ£éªé¡¹ç®åç§° |
| | | */ |
| | | private String itemName; |
| | | |
| | | /** |
| | | * åä½ |
| | | */ |
| | | private String unit; |
| | | |
| | | /** |
| | | * å¯ç¨ |
| | | */ |
| | | private Long enable; |
| | | |
| | | /** |
| | | * å é¤ |
| | | */ |
| | | private Long del; |
| | | |
| | | /** |
| | | * æ£éªé¡¹æè¿° |
| | | */ |
| | | private String itemDes; |
| | | |
| | | /** |
| | | * è§ç¨ä»£ç |
| | | */ |
| | | private String stdCode; |
| | | |
| | | /** |
| | | * ä»ªå¨æè¿° |
| | | */ |
| | | private String instrumentDes; |
| | | |
| | | /** |
| | | * 缺é·ä½ç½®-å¤è§ç¨ |
| | | */ |
| | | private String location; |
| | | |
| | | /** |
| | | * åA,B,C,Dåä¸ªçº§å« |
| | | */ |
| | | private String checkLevel; |
| | | |
| | | /** |
| | | * æ¯å¦åæé¡¹ |
| | | */ |
| | | private Long ismix; |
| | | |
| | | /** |
| | | * å
³è项ID |
| | | */ |
| | | private String rid; |
| | | |
| | | /** |
| | | * ç±»å« 0:æå 1è¾
æ |
| | | */ |
| | | private Long category; |
| | | |
| | | /** |
| | | * 仪å¨ç¼ç |
| | | */ |
| | | private String instrumentCode; |
| | | |
| | | /** |
| | | * åå¼ |
| | | */ |
| | | private Long score; |
| | | |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.dromara.qa.qm.domain.bo; |
| | | |
| | | import org.dromara.qa.qm.domain.QmCheckitem; |
| | | import org.dromara.common.mybatis.core.domain.BaseEntity; |
| | | import org.dromara.common.core.validate.AddGroup; |
| | | import org.dromara.common.core.validate.EditGroup; |
| | | import io.github.linpeilie.annotations.AutoMapper; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import jakarta.validation.constraints.*; |
| | | |
| | | /** |
| | | * è§ç¨æ£éªé¡¹ç®ä¸å¡å¯¹è±¡ qm_checkitem |
| | | * |
| | | * @author zhuguifei |
| | | * @date 2026-03-12 |
| | | */ |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @AutoMapper(target = QmCheckitem.class, reverseConvertGenerate = false) |
| | | public class QmCheckitemBo extends BaseEntity { |
| | | |
| | | /** |
| | | * ç¼ç |
| | | */ |
| | | @NotBlank(message = "ç¼ç ä¸è½ä¸ºç©º", groups = { EditGroup.class }) |
| | | private String id; |
| | | |
| | | /** |
| | | * æ£éªé¡¹ç®ä»£ç |
| | | */ |
| | | private String itemCode; |
| | | |
| | | /** |
| | | * æ£éªé¡¹ç®åç§° |
| | | */ |
| | | private String itemName; |
| | | |
| | | /** |
| | | * åä½ |
| | | */ |
| | | private String unit; |
| | | |
| | | /** |
| | | * å¯ç¨ |
| | | */ |
| | | private Long enable; |
| | | |
| | | /** |
| | | * å é¤ |
| | | */ |
| | | private Long del; |
| | | |
| | | /** |
| | | * æ£éªé¡¹æè¿° |
| | | */ |
| | | private String itemDes; |
| | | |
| | | /** |
| | | * è§ç¨ä»£ç |
| | | */ |
| | | private String stdCode; |
| | | |
| | | /** |
| | | * ä»ªå¨æè¿° |
| | | */ |
| | | private String instrumentDes; |
| | | |
| | | /** |
| | | * 缺é·ä½ç½®-å¤è§ç¨ |
| | | */ |
| | | private String location; |
| | | |
| | | /** |
| | | * åA,B,C,Dåä¸ªçº§å« |
| | | */ |
| | | private String checkLevel; |
| | | |
| | | /** |
| | | * æ¯å¦åæé¡¹ |
| | | */ |
| | | private Long ismix; |
| | | |
| | | /** |
| | | * å
³è项ID |
| | | */ |
| | | private String rid; |
| | | |
| | | /** |
| | | * ç±»å« 0:æå 1è¾
æ |
| | | */ |
| | | private Long category; |
| | | |
| | | /** |
| | | * 仪å¨ç¼ç |
| | | */ |
| | | private String instrumentCode; |
| | | |
| | | /** |
| | | * åå¼ |
| | | */ |
| | | private Long score; |
| | | |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.dromara.qa.qm.domain.vo; |
| | | |
| | | import org.dromara.qa.qm.domain.QmCheckitem; |
| | | import cn.idev.excel.annotation.ExcelIgnoreUnannotated; |
| | | import cn.idev.excel.annotation.ExcelProperty; |
| | | import org.dromara.common.excel.annotation.ExcelDictFormat; |
| | | import org.dromara.common.excel.convert.ExcelDictConvert; |
| | | import io.github.linpeilie.annotations.AutoMapper; |
| | | import lombok.Data; |
| | | |
| | | import java.io.Serial; |
| | | import java.io.Serializable; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | |
| | | |
| | | |
| | | /** |
| | | * è§ç¨æ£éªé¡¹ç®è§å¾å¯¹è±¡ qm_checkitem |
| | | * |
| | | * @author zhuguifei |
| | | * @date 2026-03-12 |
| | | */ |
| | | @Data |
| | | @ExcelIgnoreUnannotated |
| | | @AutoMapper(target = QmCheckitem.class) |
| | | public class QmCheckitemVo implements Serializable { |
| | | |
| | | @Serial |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** |
| | | * ç¼ç |
| | | */ |
| | | @ExcelProperty(value = "ç¼ç ") |
| | | private String id; |
| | | |
| | | /** |
| | | * æ£éªé¡¹ç®ä»£ç |
| | | */ |
| | | @ExcelProperty(value = "æ£éªé¡¹ç®ä»£ç ") |
| | | private String itemCode; |
| | | |
| | | /** |
| | | * æ£éªé¡¹ç®åç§° |
| | | */ |
| | | @ExcelProperty(value = "æ£éªé¡¹ç®åç§°") |
| | | private String itemName; |
| | | |
| | | /** |
| | | * åä½ |
| | | */ |
| | | @ExcelProperty(value = "åä½") |
| | | private String unit; |
| | | |
| | | /** |
| | | * å¯ç¨ |
| | | */ |
| | | @ExcelProperty(value = "å¯ç¨") |
| | | private Long enable; |
| | | |
| | | /** |
| | | * å é¤ |
| | | */ |
| | | @ExcelProperty(value = "å é¤") |
| | | private Long del; |
| | | |
| | | /** |
| | | * æ£éªé¡¹æè¿° |
| | | */ |
| | | @ExcelProperty(value = "æ£éªé¡¹æè¿°") |
| | | private String itemDes; |
| | | |
| | | /** |
| | | * è§ç¨ä»£ç |
| | | */ |
| | | @ExcelProperty(value = "è§ç¨ä»£ç ") |
| | | private String stdCode; |
| | | |
| | | /** |
| | | * ä»ªå¨æè¿° |
| | | */ |
| | | @ExcelProperty(value = "ä»ªå¨æè¿°") |
| | | private String instrumentDes; |
| | | |
| | | /** |
| | | * 缺é·ä½ç½®-å¤è§ç¨ |
| | | */ |
| | | @ExcelProperty(value = "缺é·ä½ç½®-å¤è§ç¨") |
| | | private String location; |
| | | |
| | | /** |
| | | * åA,B,C,Dåä¸ªçº§å« |
| | | */ |
| | | @ExcelProperty(value = "åA,B,C,Då个级å«") |
| | | private String checkLevel; |
| | | |
| | | /** |
| | | * æ¯å¦åæé¡¹ |
| | | */ |
| | | @ExcelProperty(value = "æ¯å¦åæé¡¹") |
| | | private Long ismix; |
| | | |
| | | /** |
| | | * å
³è项ID |
| | | */ |
| | | @ExcelProperty(value = "å
³è项ID") |
| | | private String rid; |
| | | |
| | | /** |
| | | * ç±»å« 0:æå 1è¾
æ |
| | | */ |
| | | @ExcelProperty(value = "ç±»å« 0:æå 1è¾
æ") |
| | | private Long category; |
| | | |
| | | /** |
| | | * 仪å¨ç¼ç |
| | | */ |
| | | @ExcelProperty(value = "仪å¨ç¼ç ") |
| | | private String instrumentCode; |
| | | |
| | | /** |
| | | * åå¼ |
| | | */ |
| | | @ExcelProperty(value = "åå¼") |
| | | private Long score; |
| | | |
| | | private List<QmCheckitemVo> children; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.dromara.qa.qm.mapper; |
| | | |
| | | import org.dromara.qa.qm.domain.QmCheckitem; |
| | | import org.dromara.qa.qm.domain.vo.QmCheckitemVo; |
| | | import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; |
| | | |
| | | /** |
| | | * è§ç¨æ£éªé¡¹ç®Mapperæ¥å£ |
| | | * |
| | | * @author zhuguifei |
| | | * @date 2026-03-12 |
| | | */ |
| | | public interface QmCheckitemMapper extends BaseMapperPlus<QmCheckitem, QmCheckitemVo> { |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.dromara.qa.qm.service; |
| | | |
| | | import org.dromara.qa.qm.domain.vo.QmCheckitemVo; |
| | | import org.dromara.qa.qm.domain.bo.QmCheckitemBo; |
| | | import org.dromara.common.mybatis.core.page.TableDataInfo; |
| | | import org.dromara.common.mybatis.core.page.PageQuery; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * è§ç¨æ£éªé¡¹ç®Serviceæ¥å£ |
| | | * |
| | | * @author zhuguifei |
| | | * @date 2026-03-12 |
| | | */ |
| | | public interface IQmCheckitemService { |
| | | |
| | | /** |
| | | * æ¥è¯¢è§ç¨æ£éªé¡¹ç® |
| | | * |
| | | * @param id ä¸»é® |
| | | * @return è§ç¨æ£éªé¡¹ç® |
| | | */ |
| | | QmCheckitemVo queryById(String id); |
| | | |
| | | /** |
| | | * å页æ¥è¯¢è§ç¨æ£éªé¡¹ç®å表 |
| | | * |
| | | * @param bo æ¥è¯¢æ¡ä»¶ |
| | | * @param pageQuery å页忰 |
| | | * @return è§ç¨æ£éªé¡¹ç®å页å表 |
| | | */ |
| | | TableDataInfo<QmCheckitemVo> queryPageList(QmCheckitemBo bo, PageQuery pageQuery); |
| | | |
| | | /** |
| | | * æ¥è¯¢ç¬¦åæ¡ä»¶çè§ç¨æ£éªé¡¹ç®å表 |
| | | * |
| | | * @param bo æ¥è¯¢æ¡ä»¶ |
| | | * @return è§ç¨æ£éªé¡¹ç®å表 |
| | | */ |
| | | List<QmCheckitemVo> queryList(QmCheckitemBo bo); |
| | | |
| | | List<QmCheckitemVo> queryTreeListByStdCode(String stdCode); |
| | | |
| | | /** |
| | | * æ°å¢è§ç¨æ£éªé¡¹ç® |
| | | * |
| | | * @param bo è§ç¨æ£éªé¡¹ç® |
| | | * @return æ¯å¦æ°å¢æå |
| | | */ |
| | | Boolean insertByBo(QmCheckitemBo bo); |
| | | |
| | | /** |
| | | * ä¿®æ¹è§ç¨æ£éªé¡¹ç® |
| | | * |
| | | * @param bo è§ç¨æ£éªé¡¹ç® |
| | | * @return æ¯å¦ä¿®æ¹æå |
| | | */ |
| | | Boolean updateByBo(QmCheckitemBo bo); |
| | | |
| | | /** |
| | | * æ ¡éªå¹¶æ¹éå é¤è§ç¨æ£éªé¡¹ç®ä¿¡æ¯ |
| | | * |
| | | * @param ids å¾
å é¤ç主é®éå |
| | | * @param isValid æ¯å¦è¿è¡æææ§æ ¡éª |
| | | * @return æ¯å¦å 餿å |
| | | */ |
| | | Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.dromara.qa.qm.service.impl; |
| | | |
| | | import org.dromara.common.core.utils.MapstructUtils; |
| | | import org.dromara.common.core.utils.StringUtils; |
| | | import org.dromara.common.mybatis.core.page.TableDataInfo; |
| | | import org.dromara.common.mybatis.core.page.PageQuery; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | | import org.dromara.qa.qm.domain.bo.QmCheckitemBo; |
| | | import org.dromara.qa.qm.domain.vo.QmCheckitemVo; |
| | | import org.dromara.qa.qm.domain.QmCheckitem; |
| | | import org.dromara.qa.qm.mapper.QmCheckitemMapper; |
| | | import org.dromara.qa.qm.service.IQmCheckitemService; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Collection; |
| | | |
| | | /** |
| | | * è§ç¨æ£éªé¡¹ç®Serviceä¸å¡å±å¤ç |
| | | * |
| | | * @author zhuguifei |
| | | * @date 2026-03-12 |
| | | */ |
| | | @Slf4j |
| | | @RequiredArgsConstructor |
| | | @Service |
| | | public class QmCheckitemServiceImpl implements IQmCheckitemService { |
| | | |
| | | private final QmCheckitemMapper baseMapper; |
| | | |
| | | /** |
| | | * æ¥è¯¢è§ç¨æ£éªé¡¹ç® |
| | | * |
| | | * @param id ä¸»é® |
| | | * @return è§ç¨æ£éªé¡¹ç® |
| | | */ |
| | | @Override |
| | | public QmCheckitemVo queryById(String id){ |
| | | return baseMapper.selectVoById(id); |
| | | } |
| | | |
| | | /** |
| | | * å页æ¥è¯¢è§ç¨æ£éªé¡¹ç®å表 |
| | | * |
| | | * @param bo æ¥è¯¢æ¡ä»¶ |
| | | * @param pageQuery å页忰 |
| | | * @return è§ç¨æ£éªé¡¹ç®å页å表 |
| | | */ |
| | | @Override |
| | | public TableDataInfo<QmCheckitemVo> queryPageList(QmCheckitemBo bo, PageQuery pageQuery) { |
| | | LambdaQueryWrapper<QmCheckitem> lqw = buildQueryWrapper(bo); |
| | | Page<QmCheckitemVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw); |
| | | return TableDataInfo.build(result); |
| | | } |
| | | |
| | | /** |
| | | * æ¥è¯¢ç¬¦åæ¡ä»¶çè§ç¨æ£éªé¡¹ç®å表 |
| | | * |
| | | * @param bo æ¥è¯¢æ¡ä»¶ |
| | | * @return è§ç¨æ£éªé¡¹ç®å表 |
| | | */ |
| | | @Override |
| | | public List<QmCheckitemVo> queryList(QmCheckitemBo bo) { |
| | | LambdaQueryWrapper<QmCheckitem> lqw = buildQueryWrapper(bo); |
| | | return baseMapper.selectVoList(lqw); |
| | | } |
| | | |
| | | @Override |
| | | public List<QmCheckitemVo> queryTreeListByStdCode(String stdCode) { |
| | | List<QmCheckitemVo> roots = selectTreeNodes(stdCode, null); |
| | | for (QmCheckitemVo root : roots) { |
| | | List<QmCheckitemVo> children = selectTreeNodes(stdCode, root.getId()); |
| | | for (QmCheckitemVo child : children) { |
| | | List<QmCheckitemVo> grandchildren = selectTreeNodes(stdCode, child.getId()); |
| | | child.setChildren(grandchildren); |
| | | } |
| | | root.setChildren(children); |
| | | } |
| | | return roots; |
| | | } |
| | | |
| | | private List<QmCheckitemVo> selectTreeNodes(String stdCode, String rid) { |
| | | if (StringUtils.isBlank(stdCode)) { |
| | | return new ArrayList<>(); |
| | | } |
| | | LambdaQueryWrapper<QmCheckitem> lqw = Wrappers.lambdaQuery(); |
| | | lqw.eq(QmCheckitem::getStdCode, stdCode); |
| | | lqw.ne(QmCheckitem::getDel, 1L); |
| | | if (rid == null) { |
| | | lqw.isNull(QmCheckitem::getRid); |
| | | } else { |
| | | lqw.eq(QmCheckitem::getRid, rid); |
| | | } |
| | | lqw.orderByAsc(QmCheckitem::getId); |
| | | return baseMapper.selectVoList(lqw); |
| | | } |
| | | |
| | | private LambdaQueryWrapper<QmCheckitem> buildQueryWrapper(QmCheckitemBo bo) { |
| | | Map<String, Object> params = bo.getParams(); |
| | | LambdaQueryWrapper<QmCheckitem> lqw = Wrappers.lambdaQuery(); |
| | | lqw.orderByAsc(QmCheckitem::getId); |
| | | lqw.like(StringUtils.isNotBlank(bo.getItemCode()), QmCheckitem::getItemCode, bo.getItemCode()); |
| | | lqw.like(StringUtils.isNotBlank(bo.getItemName()), QmCheckitem::getItemName, bo.getItemName()); |
| | | return lqw; |
| | | } |
| | | |
| | | /** |
| | | * æ°å¢è§ç¨æ£éªé¡¹ç® |
| | | * |
| | | * @param bo è§ç¨æ£éªé¡¹ç® |
| | | * @return æ¯å¦æ°å¢æå |
| | | */ |
| | | @Override |
| | | public Boolean insertByBo(QmCheckitemBo bo) { |
| | | QmCheckitem add = MapstructUtils.convert(bo, QmCheckitem.class); |
| | | validEntityBeforeSave(add); |
| | | boolean flag = baseMapper.insert(add) > 0; |
| | | if (flag) { |
| | | bo.setId(add.getId()); |
| | | } |
| | | return flag; |
| | | } |
| | | |
| | | /** |
| | | * ä¿®æ¹è§ç¨æ£éªé¡¹ç® |
| | | * |
| | | * @param bo è§ç¨æ£éªé¡¹ç® |
| | | * @return æ¯å¦ä¿®æ¹æå |
| | | */ |
| | | @Override |
| | | public Boolean updateByBo(QmCheckitemBo bo) { |
| | | QmCheckitem update = MapstructUtils.convert(bo, QmCheckitem.class); |
| | | validEntityBeforeSave(update); |
| | | return baseMapper.updateById(update) > 0; |
| | | } |
| | | |
| | | /** |
| | | * ä¿ååçæ°æ®æ ¡éª |
| | | */ |
| | | private void validEntityBeforeSave(QmCheckitem entity){ |
| | | //TODO åä¸äºæ°æ®æ ¡éª,å¦å¯ä¸çº¦æ |
| | | } |
| | | |
| | | /** |
| | | * æ ¡éªå¹¶æ¹éå é¤è§ç¨æ£éªé¡¹ç®ä¿¡æ¯ |
| | | * |
| | | * @param ids å¾
å é¤ç主é®éå |
| | | * @param isValid æ¯å¦è¿è¡æææ§æ ¡éª |
| | | * @return æ¯å¦å 餿å |
| | | */ |
| | | @Override |
| | | public Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid) { |
| | | if(isValid){ |
| | | //TODO åä¸äºä¸å¡ä¸çæ ¡éª,夿æ¯å¦éè¦æ ¡éª |
| | | } |
| | | return baseMapper.deleteByIds(ids) > 0; |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <?xml version="1.0" encoding="UTF-8" ?> |
| | | <!DOCTYPE mapper |
| | | PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
| | | "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="org.dromara.qa.qm.mapper.QmCheckitemMapper"> |
| | | </mapper> |
| | |
| | | monitor_online: () => import("@/views/monitor/online/index.vue"), |
| | | monitor_operlog: () => import("@/views/monitor/operlog/index.vue"), |
| | | qm_batch: () => import("@/views/qm/batch/index.vue"), |
| | | qm_checkitem: () => import("@/views/qm/checkitem/index.vue"), |
| | | qm_std: () => import("@/views/qm/std/index.vue"), |
| | | system_client: () => import("@/views/system/client/index.vue"), |
| | | system_config: () => import("@/views/system/config/index.vue"), |
| | |
| | | } |
| | | }, |
| | | { |
| | | name: 'qm_checkitem', |
| | | path: '/qm/checkitem', |
| | | component: 'view.qm_checkitem', |
| | | meta: { |
| | | title: 'qm_checkitem', |
| | | i18nKey: 'route.qm_checkitem' |
| | | } |
| | | }, |
| | | { |
| | | name: 'qm_std', |
| | | path: '/qm/std', |
| | | component: 'view.qm_std', |
| | |
| | | "monitor_operlog": "/monitor/operlog", |
| | | "qm": "/qm", |
| | | "qm_batch": "/qm/batch", |
| | | "qm_checkitem": "/qm/checkitem", |
| | | "qm_std": "/qm/std", |
| | | "social-callback": "/social-callback", |
| | | "system": "/system", |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { request } from '@/service/request'; |
| | | |
| | | /** è·åè§ç¨æ£éªé¡¹ç®å表 */ |
| | | export function fetchGetCheckitemList (params?: Api.Qm.CheckitemSearchParams) { |
| | | return request<Api.Qm.CheckitemList>({ |
| | | url: '/qm/checkitem/list', |
| | | method: 'get', |
| | | params |
| | | }); |
| | | } |
| | | |
| | | /** è·åè§ç¨æ£éªé¡¹ç®å表 */ |
| | | export function fetchGetCheckitemTree (params?: Api.Qm.CheckitemSearchParams) { |
| | | return request<Api.Qm.CheckitemList>({ |
| | | url: '/qm/checkitem/tree', |
| | | method: 'get', |
| | | params |
| | | }); |
| | | } |
| | | |
| | | /** æ°å¢è§ç¨æ£éªé¡¹ç® */ |
| | | export function fetchCreateCheckitem (data: Api.Qm.CheckitemOperateParams) { |
| | | return request<boolean>({ |
| | | url: '/qm/checkitem', |
| | | method: 'post', |
| | | data |
| | | }); |
| | | } |
| | | |
| | | /** ä¿®æ¹è§ç¨æ£éªé¡¹ç® */ |
| | | export function fetchUpdateCheckitem (data: Api.Qm.CheckitemOperateParams) { |
| | | return request<boolean>({ |
| | | url: '/qm/checkitem', |
| | | method: 'put', |
| | | data |
| | | }); |
| | | } |
| | | |
| | | /** æ¹éå é¤è§ç¨æ£éªé¡¹ç® */ |
| | | export function fetchBatchDeleteCheckitem (ids: CommonType.IdType[]) { |
| | | return request<boolean>({ |
| | | url: `/qm/checkitem/${ids.join(',')}`, |
| | | method: 'delete' |
| | | }); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /** |
| | | * Namespace Api |
| | | * |
| | | * All backend api type |
| | | */ |
| | | declare namespace Api { |
| | | /** |
| | | * namespace Qm |
| | | * |
| | | * backend api module: "Qm" |
| | | */ |
| | | namespace Qm { |
| | | /** checkitem */ |
| | | type Checkitem = Common.CommonRecord<{ |
| | | /** ç¼ç */ |
| | | id: CommonType.IdType; |
| | | /** æ£éªé¡¹ç®ä»£ç */ |
| | | itemCode: string; |
| | | /** æ£éªé¡¹ç®åç§° */ |
| | | itemName: string; |
| | | /** åä½ */ |
| | | unit: string; |
| | | /** å¯ç¨ */ |
| | | enable: number; |
| | | /** å é¤ */ |
| | | del: number; |
| | | /** æ£éªé¡¹æè¿° */ |
| | | itemDes: string; |
| | | /** è§ç¨ä»£ç */ |
| | | stdCode: string; |
| | | /** ä»ªå¨æè¿° */ |
| | | instrumentDes: string; |
| | | /** 缺é·ä½ç½®-å¤è§ç¨ */ |
| | | location: string; |
| | | /** åA,B,C,Dåä¸ªçº§å« */ |
| | | checkLevel: string; |
| | | /** æ¯å¦åæé¡¹ */ |
| | | ismix: number; |
| | | /** å
³è项ID */ |
| | | rid: CommonType.IdType; |
| | | /** ç±»å« 0:æå 1è¾
æ */ |
| | | category: number; |
| | | /** 仪å¨ç¼ç */ |
| | | instrumentCode: string; |
| | | /** åå¼ */ |
| | | score: number; |
| | | /** åèç¹ */ |
| | | children?: Api.Qm.Checkitem[]; |
| | | }>; |
| | | |
| | | /** checkitem search params */ |
| | | type CheckitemSearchParams = CommonType.RecordNullable< |
| | | Pick< |
| | | Api.Qm.Checkitem, |
| | | | 'itemCode' |
| | | | 'itemName' |
| | | | 'stdCode' |
| | | > & |
| | | Api.Common.CommonSearchParams |
| | | >; |
| | | |
| | | /** checkitem operate params */ |
| | | type CheckitemOperateParams = CommonType.RecordNullable< |
| | | Pick< |
| | | Api.Qm.Checkitem, |
| | | | 'id' |
| | | | 'itemCode' |
| | | | 'itemName' |
| | | | 'unit' |
| | | | 'enable' |
| | | | 'del' |
| | | | 'itemDes' |
| | | | 'stdCode' |
| | | | 'instrumentDes' |
| | | | 'location' |
| | | | 'checkLevel' |
| | | | 'ismix' |
| | | | 'rid' |
| | | | 'category' |
| | | | 'instrumentCode' |
| | | | 'score' |
| | | > |
| | | >; |
| | | |
| | | /** checkitem list */ |
| | | type CheckitemList = Api.Common.PaginatingQueryRecord<Checkitem>; |
| | | } |
| | | } |
| | |
| | | "monitor_operlog": "/monitor/operlog"; |
| | | "qm": "/qm"; |
| | | "qm_batch": "/qm/batch"; |
| | | "qm_checkitem": "/qm/checkitem"; |
| | | "qm_std": "/qm/std"; |
| | | "social-callback": "/social-callback"; |
| | | "system": "/system"; |
| | |
| | | | "monitor_online" |
| | | | "monitor_operlog" |
| | | | "qm_batch" |
| | | | "qm_checkitem" |
| | | | "qm_std" |
| | | | "system_client" |
| | | | "system_config" |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script setup lang="tsx"> |
| | | import { ref } from 'vue'; |
| | | import { NDivider } from 'naive-ui'; |
| | | import { fetchBatchDeleteCheckitem, fetchGetCheckitemList } from '@/service/api/qm/checkitem'; |
| | | import { useAppStore } from '@/store/modules/app'; |
| | | import { useAuth } from '@/hooks/business/auth'; |
| | | import { useDownload } from '@/hooks/business/download'; |
| | | import { defaultTransform, useNaivePaginatedTable, useTableOperate } from '@/hooks/common/table'; |
| | | import { $t } from '@/locales'; |
| | | import ButtonIcon from '@/components/custom/button-icon.vue'; |
| | | import CheckitemOperateDrawer from './modules/checkitem-operate-drawer.vue'; |
| | | import CheckitemSearch from './modules/checkitem-search.vue'; |
| | | |
| | | defineOptions({ |
| | | name: 'CheckitemList' |
| | | }); |
| | | |
| | | |
| | | const appStore = useAppStore(); |
| | | const { download } = useDownload(); |
| | | const { hasAuth } = useAuth(); |
| | | |
| | | const searchParams = ref<Api.Qm.CheckitemSearchParams>({ |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | itemCode: null, |
| | | itemName: null, |
| | | params: {} |
| | | }); |
| | | |
| | | const { columns, columnChecks, data, getData, getDataByPage, loading, mobilePagination, scrollX } = |
| | | useNaivePaginatedTable({ |
| | | api: () => fetchGetCheckitemList(searchParams.value), |
| | | transform: response => defaultTransform(response), |
| | | onPaginationParamsChange: params => { |
| | | searchParams.value.pageNum = params.page; |
| | | searchParams.value.pageSize = params.pageSize; |
| | | }, |
| | | columns: () => [ |
| | | { |
| | | type: 'selection', |
| | | align: 'center', |
| | | width: 48 |
| | | }, |
| | | { |
| | | key: 'index', |
| | | title: $t('common.index'), |
| | | align: 'center', |
| | | width: 64, |
| | | render: (_, index) => index + 1 |
| | | }, |
| | | { |
| | | key: 'itemCode', |
| | | title: '项ç®ä»£ç ', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'itemName', |
| | | title: '项ç®åç§°', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'location', |
| | | title: 'ä½ç½®', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'instrumentDes', |
| | | title: 'ä»ªå¨æè¿°', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'itemDes', |
| | | title: 'é¡¹ç®æè¿°', |
| | | align: 'center', |
| | | width: 200 |
| | | }, |
| | | { |
| | | key: 'ismix', |
| | | title: 'æ¯å¦åæé¡¹', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'score', |
| | | title: 'åå¼', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'enable', |
| | | title: 'å¯ç¨', |
| | | align: 'center', |
| | | minWidth: 120 |
| | | }, |
| | | { |
| | | key: 'operate', |
| | | title: $t('common.operate'), |
| | | align: 'center', |
| | | width: 130, |
| | | render: row => { |
| | | const divider = () => { |
| | | if (!hasAuth('qm:checkitem:edit') || !hasAuth('qm:checkitem:remove')) { |
| | | return null; |
| | | } |
| | | return <NDivider vertical />; |
| | | }; |
| | | |
| | | const editBtn = () => { |
| | | if (!hasAuth('qm:checkitem:edit')) { |
| | | return null; |
| | | } |
| | | return ( |
| | | <ButtonIcon |
| | | text |
| | | type="primary" |
| | | icon="material-symbols:drive-file-rename-outline-outline" |
| | | tooltipContent={$t('common.edit')} |
| | | onClick={() => edit(row.id)} |
| | | /> |
| | | ); |
| | | }; |
| | | |
| | | const deleteBtn = () => { |
| | | if (!hasAuth('qm:checkitem:remove')) { |
| | | return null; |
| | | } |
| | | return ( |
| | | <ButtonIcon |
| | | text |
| | | type="error" |
| | | icon="material-symbols:delete-outline" |
| | | tooltipContent={$t('common.delete')} |
| | | popconfirmContent={$t('common.confirmDelete')} |
| | | onPositiveClick={() => handleDelete(row.id)} |
| | | /> |
| | | ); |
| | | }; |
| | | |
| | | return ( |
| | | <div class="flex-center gap-8px"> |
| | | {editBtn()} |
| | | {divider()} |
| | | {deleteBtn()} |
| | | </div> |
| | | ); |
| | | } |
| | | } |
| | | ] |
| | | }); |
| | | |
| | | const { drawerVisible, operateType, editingData, handleAdd, handleEdit, checkedRowKeys, onBatchDeleted, onDeleted } = |
| | | useTableOperate(data, 'id', getData); |
| | | |
| | | async function handleBatchDelete() { |
| | | // request |
| | | const { error } = await fetchBatchDeleteCheckitem(checkedRowKeys.value); |
| | | if (error) return; |
| | | onBatchDeleted(); |
| | | } |
| | | |
| | | async function handleDelete(id: CommonType.IdType) { |
| | | // request |
| | | const { error } = await fetchBatchDeleteCheckitem([id]); |
| | | if (error) return; |
| | | onDeleted(); |
| | | } |
| | | |
| | | function edit(id: CommonType.IdType) { |
| | | handleEdit(id); |
| | | } |
| | | |
| | | function handleExport() { |
| | | download('/qm/checkitem/export', searchParams.value, `è§ç¨æ£éªé¡¹ç®_${new Date().getTime()}.xlsx`); |
| | | } |
| | | </script> |
| | | |
| | | <template> |
| | | <div class="min-h-500px flex-col-stretch gap-16px overflow-hidden lt-sm:overflow-auto"> |
| | | <CheckitemSearch v-model:model="searchParams" @search="getDataByPage" /> |
| | | <NCard title="è§ç¨æ£éªé¡¹ç®å表" :bordered="false" size="small" class="card-wrapper sm:flex-1-hidden"> |
| | | <template #header-extra> |
| | | <TableHeaderOperation |
| | | v-model:columns="columnChecks" |
| | | :disabled-delete="checkedRowKeys.length === 0" |
| | | :loading="loading" |
| | | :show-add="hasAuth('qm:checkitem:add')" |
| | | :show-delete="hasAuth('qm:checkitem:remove')" |
| | | :show-export="hasAuth('qm:checkitem:export')" |
| | | @add="handleAdd" |
| | | @delete="handleBatchDelete" |
| | | @export="handleExport" |
| | | @refresh="getData" |
| | | /> |
| | | </template> |
| | | <NDataTable |
| | | v-model:checked-row-keys="checkedRowKeys" |
| | | :columns="columns" |
| | | :data="data" |
| | | size="small" |
| | | :flex-height="!appStore.isMobile" |
| | | :scroll-x="scrollX" |
| | | :loading="loading" |
| | | remote |
| | | :row-key="row => row.id" |
| | | :pagination="mobilePagination" |
| | | class="sm:h-full" |
| | | /> |
| | | <CheckitemOperateDrawer |
| | | v-model:visible="drawerVisible" |
| | | :operate-type="operateType" |
| | | :row-data="editingData" |
| | | @submitted="getDataByPage" |
| | | /> |
| | | </NCard> |
| | | </div> |
| | | </template> |
| | | |
| | | <style scoped></style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script setup lang="ts"> |
| | | import { computed, ref, watch } from 'vue'; |
| | | import { jsonClone } from '@sa/utils'; |
| | | import { fetchCreateCheckitem, fetchUpdateCheckitem } from '@/service/api/qm/checkitem'; |
| | | import { useFormRules, useNaiveForm } from '@/hooks/common/form'; |
| | | import { $t } from '@/locales'; |
| | | |
| | | defineOptions({ |
| | | name: 'CheckitemOperateDrawer' |
| | | }); |
| | | |
| | | interface Props { |
| | | /** the type of operation */ |
| | | operateType: NaiveUI.TableOperateType; |
| | | /** the edit row data */ |
| | | rowData?: Api.Qm.Checkitem | null; |
| | | } |
| | | |
| | | const props = defineProps<Props>(); |
| | | |
| | | interface Emits { |
| | | (e: 'submitted'): void; |
| | | } |
| | | |
| | | const emit = defineEmits<Emits>(); |
| | | |
| | | const visible = defineModel<boolean>('visible', { |
| | | default: false |
| | | }); |
| | | |
| | | const { formRef, validate, restoreValidation } = useNaiveForm(); |
| | | const { createRequiredRule } = useFormRules(); |
| | | |
| | | const title = computed(() => { |
| | | const titles: Record<NaiveUI.TableOperateType, string> = { |
| | | add: 'æ°å¢è§ç¨æ£éªé¡¹ç®', |
| | | edit: 'ç¼è¾è§ç¨æ£éªé¡¹ç®' |
| | | }; |
| | | return titles[props.operateType]; |
| | | }); |
| | | |
| | | type Model = Api.Qm.CheckitemOperateParams; |
| | | |
| | | const model = ref<Model>(createDefaultModel()); |
| | | |
| | | function createDefaultModel(): Model { |
| | | return { |
| | | id: '', |
| | | itemCode: '', |
| | | itemName: '', |
| | | unit: '', |
| | | enable: null, |
| | | del: null, |
| | | itemDes: '', |
| | | stdCode: '', |
| | | instrumentDes: '', |
| | | location: '', |
| | | checkLevel: '', |
| | | ismix: null, |
| | | rid: '', |
| | | category: null, |
| | | instrumentCode: '', |
| | | score: null |
| | | }; |
| | | } |
| | | |
| | | type RuleKey = Extract< |
| | | keyof Model, |
| | | | 'id' |
| | | >; |
| | | |
| | | const rules: Record<RuleKey, App.Global.FormRule> = { |
| | | id: createRequiredRule('ç¼ç ä¸è½ä¸ºç©º'), |
| | | }; |
| | | |
| | | function handleUpdateModelWhenEdit() { |
| | | model.value = createDefaultModel(); |
| | | |
| | | if (props.operateType === 'edit' && props.rowData) { |
| | | Object.assign(model.value, jsonClone(props.rowData)); |
| | | } |
| | | } |
| | | |
| | | function closeDrawer() { |
| | | visible.value = false; |
| | | } |
| | | |
| | | async function handleSubmit() { |
| | | await validate(); |
| | | |
| | | const { id, itemCode, itemName, unit, enable, del, itemDes, stdCode, instrumentDes, location, checkLevel, ismix, rid, category, instrumentCode, score } = model.value; |
| | | |
| | | // request |
| | | if (props.operateType === 'add') { |
| | | const { error } = await fetchCreateCheckitem({ itemCode, itemName, unit, enable, del, itemDes, stdCode, instrumentDes, location, checkLevel, ismix, rid, category, instrumentCode, score }); |
| | | if (error) return; |
| | | } |
| | | |
| | | if (props.operateType === 'edit') { |
| | | const { error } = await fetchUpdateCheckitem({ id, itemCode, itemName, unit, enable, del, itemDes, stdCode, instrumentDes, location, checkLevel, ismix, rid, category, instrumentCode, score }); |
| | | if (error) return; |
| | | } |
| | | |
| | | window.$message?.success($t('common.updateSuccess')); |
| | | closeDrawer(); |
| | | emit('submitted'); |
| | | } |
| | | |
| | | watch(visible, () => { |
| | | if (visible.value) { |
| | | handleUpdateModelWhenEdit(); |
| | | restoreValidation(); |
| | | getTreeList(); |
| | | } |
| | | }); |
| | | </script> |
| | | |
| | | <template> |
| | | <NDrawer v-model:show="visible" :title="title" display-directive="show" :width="800" class="max-w-90%"> |
| | | <NDrawerContent :title="title" :native-scrollbar="false" closable> |
| | | <NForm ref="formRef" :model="model" :rules="rules"> |
| | | <NFormItem label="æ£éªé¡¹ç®ä»£ç " path="itemCode"> |
| | | <NInput v-model:value="model.itemCode" placeholder="请è¾å
¥æ£éªé¡¹ç®ä»£ç " /> |
| | | </NFormItem> |
| | | <NFormItem label="æ£éªé¡¹ç®åç§°" path="itemName"> |
| | | <NInput v-model:value="model.itemName" placeholder="请è¾å
¥æ£éªé¡¹ç®åç§°" /> |
| | | </NFormItem> |
| | | <NFormItem label="åä½" path="unit"> |
| | | <NInput v-model:value="model.unit" placeholder="请è¾å
¥åä½" /> |
| | | </NFormItem> |
| | | <NFormItem label="å¯ç¨" path="enable"> |
| | | <NInput v-model:value="model.enable" placeholder="请è¾å
¥å¯ç¨" /> |
| | | </NFormItem> |
| | | <NFormItem label="å é¤" path="del"> |
| | | <NInput v-model:value="model.del" placeholder="请è¾å
¥å é¤" /> |
| | | </NFormItem> |
| | | <NFormItem label="æ£éªé¡¹æè¿°" path="itemDes"> |
| | | <NInput v-model:value="model.itemDes" placeholder="请è¾å
¥æ£éªé¡¹æè¿°" /> |
| | | </NFormItem> |
| | | <NFormItem label="è§ç¨ä»£ç " path="stdCode"> |
| | | <NInput v-model:value="model.stdCode" placeholder="请è¾å
¥è§ç¨ä»£ç " /> |
| | | </NFormItem> |
| | | <NFormItem label="ä»ªå¨æè¿°" path="instrumentDes"> |
| | | <NInput v-model:value="model.instrumentDes" placeholder="请è¾å
¥ä»ªå¨æè¿°" /> |
| | | </NFormItem> |
| | | <NFormItem label="缺é·ä½ç½®-å¤è§ç¨" path="location"> |
| | | <NInput v-model:value="model.location" placeholder="请è¾å
¥ç¼ºé·ä½ç½®-å¤è§ç¨" /> |
| | | </NFormItem> |
| | | <NFormItem label="åA,B,C,Då个级å«" path="checkLevel"> |
| | | <NInput v-model:value="model.checkLevel" placeholder="请è¾å
¥åA,B,C,Då个级å«" /> |
| | | </NFormItem> |
| | | <NFormItem label="æ¯å¦åæé¡¹" path="ismix"> |
| | | <NInput v-model:value="model.ismix" placeholder="请è¾å
¥æ¯å¦åæé¡¹" /> |
| | | </NFormItem> |
| | | <NFormItem label="å
³è项ID" path="rid"> |
| | | <NInput v-model:value="model.rid" placeholder="请è¾å
¥å
³è项ID" /> |
| | | </NFormItem> |
| | | <NFormItem label="ç±»å« 0:æå 1è¾
æ" path="category"> |
| | | <NInput v-model:value="model.category" placeholder="请è¾å
¥ç±»å« 0:æå 1è¾
æ" /> |
| | | </NFormItem> |
| | | <NFormItem label="仪å¨ç¼ç " path="instrumentCode"> |
| | | <NInput v-model:value="model.instrumentCode" placeholder="请è¾å
¥ä»ªå¨ç¼ç " /> |
| | | </NFormItem> |
| | | <NFormItem label="åå¼" path="score"> |
| | | <NInput v-model:value="model.score" placeholder="请è¾å
¥åå¼" /> |
| | | </NFormItem> |
| | | </NForm> |
| | | <template #footer> |
| | | <NSpace :size="16"> |
| | | <NButton @click="closeDrawer">{{ $t('common.cancel') }}</NButton> |
| | | <NButton type="primary" @click="handleSubmit">{{ $t('common.confirm') }}</NButton> |
| | | </NSpace> |
| | | </template> |
| | | </NDrawerContent> |
| | | </NDrawer> |
| | | </template> |
| | | |
| | | <style scoped></style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script setup lang="ts"> |
| | | import { toRaw } from 'vue'; |
| | | import { jsonClone } from '@sa/utils'; |
| | | import { useNaiveForm } from '@/hooks/common/form'; |
| | | import { $t } from '@/locales'; |
| | | |
| | | defineOptions({ |
| | | name: 'CheckitemSearch' |
| | | }); |
| | | |
| | | interface Emits { |
| | | (e: 'search'): void; |
| | | } |
| | | |
| | | const emit = defineEmits<Emits>(); |
| | | |
| | | const { formRef, validate, restoreValidation } = useNaiveForm(); |
| | | |
| | | const model = defineModel<Api.Qm.CheckitemSearchParams>('model', { required: true }); |
| | | |
| | | const defaultModel = jsonClone(toRaw(model.value)); |
| | | |
| | | function resetModel() { |
| | | Object.assign(model.value, defaultModel); |
| | | } |
| | | |
| | | async function reset() { |
| | | await restoreValidation(); |
| | | resetModel(); |
| | | emit('search'); |
| | | } |
| | | |
| | | async function search() { |
| | | await validate(); |
| | | emit('search'); |
| | | } |
| | | </script> |
| | | |
| | | <template> |
| | | <NCard :bordered="false" size="small" class="card-wrapper"> |
| | | <NCollapse> |
| | | <NCollapseItem :title="$t('common.search')" name="qm-checkitem-search"> |
| | | <NForm ref="formRef" :model="model" label-placement="left" :label-width="80"> |
| | | <NGrid responsive="screen" item-responsive> |
| | | <NFormItemGi span="24 s:12 m:6" label="æ£éªé¡¹ç®ä»£ç " label-width="auto" path="itemCode" class="pr-24px"> |
| | | <NInput v-model:value="model.itemCode" placeholder="请è¾å
¥æ£éªé¡¹ç®ä»£ç " /> |
| | | </NFormItemGi> |
| | | <NFormItemGi span="24 s:12 m:6" label="æ£éªé¡¹ç®åç§°" label-width="auto" path="itemName" class="pr-24px"> |
| | | <NInput v-model:value="model.itemName" placeholder="请è¾å
¥æ£éªé¡¹ç®åç§°" /> |
| | | </NFormItemGi> |
| | | <NFormItemGi :show-feedback="false" span="24" class="pr-24px"> |
| | | <NSpace class="w-full" justify="end"> |
| | | <NButton @click="reset"> |
| | | <template #icon> |
| | | <icon-ic-round-refresh class="text-icon" /> |
| | | </template> |
| | | {{ $t('common.reset') }} |
| | | </NButton> |
| | | <NButton type="primary" ghost @click="search"> |
| | | <template #icon> |
| | | <icon-ic-round-search class="text-icon" /> |
| | | </template> |
| | | {{ $t('common.search') }} |
| | | </NButton> |
| | | </NSpace> |
| | | </NFormItemGi> |
| | | </NGrid> |
| | | </NForm> |
| | | </NCollapseItem> |
| | | </NCollapse> |
| | | </NCard> |
| | | </template> |
| | | |
| | | <style scoped></style> |
| | |
| | | import ButtonIcon from '@/components/custom/button-icon.vue'; |
| | | import StdOperateDrawer from './modules/std-operate-drawer.vue'; |
| | | import StdSearch from './modules/std-search.vue'; |
| | | import StdSubTable from './modules/std-sub-table.vue'; |
| | | |
| | | defineOptions({ |
| | | name: 'StdList' |
| | |
| | | const appStore = useAppStore(); |
| | | const { download } = useDownload(); |
| | | const { hasAuth } = useAuth(); |
| | | |
| | | const selectedStdId = ref<CommonType.IdType | null>(null); |
| | | |
| | | const searchParams = ref<Api.Qm.StdSearchParams>({ |
| | | pageNum: 1, |
| | |
| | | minWidth: 120, |
| | | render: row => { |
| | | const v = String(row?.category ?? ''); |
| | | return v === '0' ? 'æå' : v === '1' ? 'è¾
æ' : v; |
| | | if (v === '0') return 'æå'; |
| | | if (v === '1') return 'è¾
æ'; |
| | | return v; |
| | | } |
| | | }, |
| | | { |
| | |
| | | minWidth: 120, |
| | | render: row => { |
| | | const v = String(row?.enable ?? ''); |
| | | return v === '0' ? 'åç¨' : v === '1' ? 'å¯ç¨' : v; |
| | | if (v === '0') return 'åç¨'; |
| | | if (v === '1') return 'å¯ç¨'; |
| | | return v; |
| | | } |
| | | }, |
| | | { |
| | |
| | | function handleExport() { |
| | | download('/qm/std/export', searchParams.value, `å¤å®è§ç¨_${new Date().getTime()}.xlsx`); |
| | | } |
| | | |
| | | function handleRowClick(row: any) { |
| | | return { |
| | | onClick: (e: MouseEvent) => { |
| | | const target = e.target as HTMLElement | null; |
| | | if (target?.closest('.n-checkbox') || target?.closest('.n-button') || target?.closest('a')) return; |
| | | selectedStdId.value = row.id; |
| | | }, |
| | | style: 'cursor: pointer;' |
| | | }; |
| | | } |
| | | </script> |
| | | |
| | | <template> |
| | | <div class="min-h-500px flex-col-stretch gap-16px overflow-hidden lt-sm:overflow-auto"> |
| | | <StdSearch v-model:model="searchParams" @search="getDataByPage" /> |
| | | <NCard title="å¤å®è§ç¨å表" :bordered="false" size="small" class="card-wrapper sm:flex-1-hidden"> |
| | | <template #header-extra> |
| | | <TableHeaderOperation |
| | | v-model:columns="columnChecks" |
| | | :disabled-delete="checkedRowKeys.length === 0" |
| | | :loading="loading" |
| | | :show-add="hasAuth('qm:std:add')" |
| | | :show-delete="hasAuth('qm:std:remove')" |
| | | :show-export="hasAuth('qm:std:export')" |
| | | @add="handleAdd" |
| | | @delete="handleBatchDelete" |
| | | @export="handleExport" |
| | | @refresh="getData" |
| | | /> |
| | | </template> |
| | | <NDataTable |
| | | v-model:checked-row-keys="checkedRowKeys" |
| | | :columns="columns" |
| | | :data="data" |
| | | <div class="flex-col-stretch gap-16px sm:flex-1-hidden"> |
| | | <NCard |
| | | title="å¤å®è§ç¨å表" |
| | | :bordered="false" |
| | | size="small" |
| | | :flex-height="!appStore.isMobile" |
| | | :scroll-x="scrollX" |
| | | :loading="loading" |
| | | remote |
| | | :row-key="row => row.id" |
| | | :pagination="mobilePagination" |
| | | class="sm:h-full" |
| | | /> |
| | | <StdOperateDrawer |
| | | v-model:visible="drawerVisible" |
| | | :operate-type="operateType" |
| | | :row-data="editingData" |
| | | @submitted="getDataByPage" |
| | | /> |
| | | </NCard> |
| | | class="card-wrapper flex-col-stretch sm:flex-1-hidden" |
| | | :content-style="{ flex: 1, overflow: 'hidden', display: 'flex', flexDirection: 'column' }" |
| | | > |
| | | <template #header-extra> |
| | | <TableHeaderOperation |
| | | v-model:columns="columnChecks" |
| | | :disabled-delete="checkedRowKeys.length === 0" |
| | | :loading="loading" |
| | | :show-add="hasAuth('qm:std:add')" |
| | | :show-delete="hasAuth('qm:std:remove')" |
| | | :show-export="hasAuth('qm:std:export')" |
| | | @add="handleAdd" |
| | | @delete="handleBatchDelete" |
| | | @export="handleExport" |
| | | @refresh="getData" |
| | | /> |
| | | </template> |
| | | <NDataTable |
| | | v-model:checked-row-keys="checkedRowKeys" |
| | | :columns="columns" |
| | | :data="data" |
| | | size="small" |
| | | :flex-height="!appStore.isMobile" |
| | | :scroll-x="scrollX" |
| | | :loading="loading" |
| | | remote |
| | | :row-key="row => row.id" |
| | | :pagination="mobilePagination" |
| | | :row-props="handleRowClick" |
| | | class="flex-1-hidden" |
| | | /> |
| | | <StdOperateDrawer |
| | | v-model:visible="drawerVisible" |
| | | :operate-type="operateType" |
| | | :row-data="editingData" |
| | | @submitted="getDataByPage" |
| | | /> |
| | | </NCard> |
| | | <StdSubTable :std-id="selectedStdId" class="sm:flex-1-hidden" /> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <style scoped></style> |
| | | <style scoped> |
| | | :deep(.n-data-table-th), |
| | | :deep(.n-data-table-td) { |
| | | padding: 4px 6px; |
| | | overflow: hidden; |
| | | } |
| | | |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script setup lang="tsx"> |
| | | import { computed, ref, watch } from 'vue'; |
| | | import { useLoading } from '@sa/hooks'; |
| | | import { $t } from '@/locales'; |
| | | import { fetchGetCheckitemTree } from '@/service/api/qm/checkitem'; |
| | | import type { DataTableColumns, DataTableRowKey } from 'naive-ui'; |
| | | |
| | | defineOptions({ |
| | | name: 'StdSubTable' |
| | | }); |
| | | |
| | | interface Props { |
| | | stdId?: CommonType.IdType | null; |
| | | } |
| | | |
| | | const props = withDefaults(defineProps<Props>(), { |
| | | stdId: null |
| | | }); |
| | | |
| | | interface StdSubRow extends Api.Qm.Checkitem { |
| | | children?: StdSubRow[]; |
| | | } |
| | | |
| | | const { loading, startLoading, endLoading } = useLoading(); |
| | | const rows = ref<StdSubRow[]>([]); |
| | | |
| | | async function getSubList() { |
| | | if (!props.stdId) { |
| | | rows.value = []; |
| | | return; |
| | | } |
| | | |
| | | startLoading(); |
| | | try { |
| | | const { data, error } = await fetchGetCheckitemTree({ |
| | | pageNum: 1, |
| | | pageSize: 9999, |
| | | stdCode: String(props.stdId) |
| | | }); |
| | | if (error) { |
| | | rows.value = []; |
| | | return; |
| | | } |
| | | |
| | | rows.value = data.rows; |
| | | } finally { |
| | | endLoading(); |
| | | } |
| | | } |
| | | |
| | | watch( |
| | | () => props.stdId, |
| | | async () => { |
| | | await getSubList(); |
| | | }, |
| | | { immediate: true } |
| | | ); |
| | | |
| | | const columns = computed<DataTableColumns<StdSubRow>>(() => [ |
| | | { |
| | | key: 'index', |
| | | title: $t('common.index'), |
| | | align: 'center', |
| | | width: 56, |
| | | render: (_: any, index: number) => index + 1 |
| | | }, |
| | | { |
| | | key: 'itemName', |
| | | title: '项ç®åç§°', |
| | | align: 'left', |
| | | width: 400, |
| | | tree: true |
| | | } as any, |
| | | { |
| | | key: 'itemCode', |
| | | title: '项ç®ä»£ç ', |
| | | align: 'center', |
| | | width: 180 |
| | | }, |
| | | { |
| | | key: 'unit', |
| | | title: 'åä½', |
| | | align: 'center', |
| | | width: 80 |
| | | }, |
| | | { |
| | | key: 'enable', |
| | | title: 'å¯ç¨', |
| | | align: 'center', |
| | | width: 72, |
| | | render: row => (String(row.enable) === '1' ? 'å¯ç¨' : 'åç¨') |
| | | }, |
| | | { |
| | | key: 'score', |
| | | title: 'åå¼', |
| | | align: 'center', |
| | | width: 80 |
| | | }, |
| | | { |
| | | key: 'itemDes', |
| | | title: 'æè¿°', |
| | | align: 'center', |
| | | minWidth: 160 |
| | | } |
| | | ]); |
| | | |
| | | function rowKey(row: StdSubRow): DataTableRowKey { |
| | | return String(row.id); |
| | | } |
| | | </script> |
| | | |
| | | <template> |
| | | <NCard |
| | | title="è§ç¨æç»" |
| | | :bordered="false" |
| | | size="small" |
| | | class="flex-col-stretch card-wrapper" |
| | | :content-style="{ flex: 1, overflow: 'hidden', display: 'flex', flexDirection: 'column' }" |
| | | > |
| | | <template #header-extra> |
| | | <span class="text-13px text-gray-500">{{ props.stdId ? `STD CODEï¼${props.stdId}` : '' }}</span> |
| | | </template> |
| | | |
| | | <NSpin :show="loading" class="h-full" content-class="h-full"> |
| | | <div v-if="!props.stdId" class="h-full flex-center text-gray-400">请ç¹å»ä¸æ¹è¡¨æ ¼è¡æ¥çæç»</div> |
| | | <NDataTable |
| | | v-else |
| | | :columns="columns as any" |
| | | :data="rows" |
| | | size="small" |
| | | flex-height |
| | | children-key="children" |
| | | :row-key="rowKey" |
| | | default-expand-all |
| | | striped |
| | | style="height: 200px" |
| | | /> |
| | | </NSpin> |
| | | </NCard> |
| | | </template> |
| | | |
| | | <style scoped> |
| | | :deep(.n-card__content) { |
| | | padding: 8px 12px; |
| | | } |
| | | |
| | | :deep(.n-data-table-th), |
| | | :deep(.n-data-table-td) { |
| | | padding: 4px 6px; |
| | | } |
| | | </style> |