xiexiang 1 年間 前
コミット
dca60818d0

+ 37 - 0
src/main/java/cn/cslg/pas/common/dto/business/CustomFieldDTO.java

@@ -0,0 +1,37 @@
+package cn.cslg.pas.common.dto.business;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+
+/**
+ * 自定义栏位DTO
+ * @Author xiexiang
+ * @Date 2023/11/13
+ */
+@Data
+public class CustomFieldDTO {
+    /**
+     * 自定义栏位名称
+     */
+    private String name;
+
+    /**
+     * 报告/专题库id
+     */
+    private Integer projectId;
+
+    /**
+     * 类型(2文本、0数字、1日期、6树、选项4单选 5多选)
+     */
+    private Integer type;
+
+    /**
+     * 描述
+     */
+    private String description;
+
+    /**
+     * 状态
+     */
+    private Boolean status;
+}

+ 22 - 0
src/main/java/cn/cslg/pas/common/dto/business/CustomOptionDTO.java

@@ -0,0 +1,22 @@
+package cn.cslg.pas.common.dto.business;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+
+/**
+ * 自定义选项DTO
+ * @Author xiexiang
+ * @Date 2023/11/13
+ */
+@Data
+public class CustomOptionDTO {
+    /**
+     * 选项值
+     */
+    private String name;
+
+    /**
+     * 所属自定义栏位
+     */
+    private Integer customFieldId;
+}

+ 42 - 0
src/main/java/cn/cslg/pas/common/dto/business/UpdateCustomFieldDTO.java

@@ -0,0 +1,42 @@
+package cn.cslg.pas.common.dto.business;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+
+/**
+ * 自定义栏位更新DTO
+ * @Author xiexiang
+ * @Date 2023/11/13
+ */
+@Data
+public class UpdateCustomFieldDTO {
+    /**
+     * id
+     */
+    private Integer id;
+
+    /**
+     * 自定义栏位名称
+     */
+    private String name;
+
+    /**
+     * 报告/专题库id
+     */
+    private Integer projectId;
+
+    /**
+     * 类型(文本、数字、日期、树、选项)
+     */
+    private Integer type;
+
+    /**
+     * 描述
+     */
+    private String description;
+
+    /**
+     * 状态
+     */
+    private Boolean status;
+}

+ 26 - 0
src/main/java/cn/cslg/pas/common/dto/business/UpdateCustomOptionDTO.java

@@ -0,0 +1,26 @@
+package cn.cslg.pas.common.dto.business;
+
+import lombok.Data;
+
+/**
+ * 更新自定义选项DTO
+ * @Author xiexiang
+ * @Date 2023/11/13
+ */
+@Data
+public class UpdateCustomOptionDTO {
+    /**
+     * id
+     */
+    private Integer id;
+
+    /**
+     * 选项值
+     */
+    private String name;
+
+    /**
+     * 所属自定义栏位
+     */
+    private Integer customFieldId;
+}

+ 59 - 0
src/main/java/cn/cslg/pas/common/vo/business/CustomFieldVO.java

@@ -0,0 +1,59 @@
+package cn.cslg.pas.common.vo.business;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 自定义栏位查询VO
+ * @Author xiexiang
+ * @Date 2023/11/13
+ */
+@Data
+public class CustomFieldVO {
+    /**
+     * id
+     */
+    private Integer id;
+
+    /**
+     * 自定义栏位名称
+     */
+    private String name;
+
+    /**
+     * 报告/专题库id
+     */
+    private Integer projectId;
+
+    /**
+     * 类型
+     */
+    private Integer type;
+
+    /**
+     * 描述
+     */
+    private String description;
+
+    /**
+     * 状态
+     */
+    private Boolean status;
+
+    /**
+     * 创建人
+     */
+    private String createId;
+
+    /**
+     * 创建人名称
+     */
+    private String createName;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+}

+ 44 - 0
src/main/java/cn/cslg/pas/common/vo/business/CustomOptionVO.java

@@ -0,0 +1,44 @@
+package cn.cslg.pas.common.vo.business;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 自定义选项VO类
+ * @Author xiexiang
+ * @Date 2023/11/14
+ */
+@Data
+public class CustomOptionVO {
+    /**
+     * id
+     */
+    private Integer id;
+
+    /**
+     * 选项值
+     */
+    private String name;
+
+    /**
+     * 所属自定义栏位
+     */
+    private Integer customFieldId;
+
+    /**
+     * 创建人
+     */
+    private String createId;
+
+    /**
+     * 创建人
+     */
+    private String createName;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+}

+ 87 - 0
src/main/java/cn/cslg/pas/controller/CustomFieldController.java

@@ -0,0 +1,87 @@
+package cn.cslg.pas.controller;
+
+import cn.cslg.pas.common.core.base.Constants;
+import cn.cslg.pas.common.dto.business.CustomFieldDTO;
+import cn.cslg.pas.common.dto.business.UpdateCustomFieldDTO;
+import cn.cslg.pas.common.model.cronModel.Records;
+import cn.cslg.pas.common.model.request.StringRequest;
+import cn.cslg.pas.common.utils.Response;
+import cn.cslg.pas.exception.ConditionException;
+import cn.cslg.pas.exception.UnLoginException;
+import cn.cslg.pas.exception.XiaoShiException;
+import cn.cslg.pas.factorys.businessFactory.Business;
+import cn.cslg.pas.factorys.businessFactory.BusinessFactory;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 自定义栏位Controller层
+ * @Author xiexiang
+ * @Date 2023/11/13
+ */
+@Slf4j
+@RequestMapping(Constants.API_XiaoSHI + "/customField")
+@RestController
+public class CustomFieldController {
+    @Autowired
+    private BusinessFactory businessFactory;
+
+    @Operation(summary = "查询自定义栏位")
+    @PostMapping("/queryCustomField")
+    public Response queryCustomField(@RequestBody StringRequest stringRequest) throws Exception {
+        Business business = businessFactory.getClass("customFieldService");
+        Records records = (Records) business.queryMessage(stringRequest);
+        return Response.success(records);
+    }
+
+    @Operation(summary = "新增自定义栏位")
+    @PostMapping("/addCustomField")
+    public Response addCustomField(@RequestBody CustomFieldDTO customFieldDTO) throws Exception {
+        if(customFieldDTO != null){
+            Business business = businessFactory.getClass("customFieldService");
+            Integer id = null;
+            try {
+                id = (Integer) business.addMessage(customFieldDTO);
+            } catch (Exception e){
+                if(e instanceof XiaoShiException) {
+                    return Response.error(e.getMessage());
+                } else if (e instanceof UnLoginException) {
+                    return Response.unLogin(e.getMessage());
+                } else if (e instanceof ConditionException) {
+                    return Response.conditionError(e.getMessage());
+                }
+            }
+            return Response.success(id);
+        } else {
+            return Response.error("网络异常");
+        }
+    }
+
+    @Operation(summary = "更新自定义栏位")
+    @PostMapping("/updateCustomField")
+    public Response updateCustomField(@RequestBody UpdateCustomFieldDTO updateCustomFieldDTO) throws Exception {
+        if (updateCustomFieldDTO != null) {
+            Business business = businessFactory.getClass("customFieldService");
+            Integer id = (Integer) business.updateMessage(updateCustomFieldDTO);
+            return Response.success(id);
+        } else {
+            return Response.error("网络异常");
+        }
+    }
+
+    @Operation(summary = "删除自定义栏位")
+    @PostMapping("/deleteCustomField")
+    public Response deleteCustomField(@RequestBody List<Integer> ids) throws Exception {
+        Business business = businessFactory.getClass("customFieldService");
+        business.deleteMessage(ids);
+        return Response.success("删除成功");
+    }
+
+}

+ 88 - 0
src/main/java/cn/cslg/pas/controller/CustomOptionController.java

@@ -0,0 +1,88 @@
+package cn.cslg.pas.controller;
+
+import cn.cslg.pas.common.core.base.Constants;
+import cn.cslg.pas.common.dto.business.CustomFieldDTO;
+import cn.cslg.pas.common.dto.business.CustomOptionDTO;
+import cn.cslg.pas.common.dto.business.UpdateCustomFieldDTO;
+import cn.cslg.pas.common.dto.business.UpdateCustomOptionDTO;
+import cn.cslg.pas.common.model.cronModel.Records;
+import cn.cslg.pas.common.model.request.StringRequest;
+import cn.cslg.pas.common.utils.Response;
+import cn.cslg.pas.common.vo.business.CustomOptionVO;
+import cn.cslg.pas.exception.ConditionException;
+import cn.cslg.pas.exception.UnLoginException;
+import cn.cslg.pas.exception.XiaoShiException;
+import cn.cslg.pas.factorys.businessFactory.Business;
+import cn.cslg.pas.service.business.CustomOptionService;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 自定义选项Controller层
+ * @Author xiexiang
+ * @Date 2023/11/13
+ */
+@Slf4j
+@RequestMapping(Constants.API_XiaoSHI + "/customOption")
+@RestController
+public class CustomOptionController {
+    @Autowired
+    private CustomOptionService customOptionService;
+
+    @Operation(summary = "查询自定义选项")
+    @PostMapping("/queryCustomOption")
+    public Response queryCustomOption(@RequestBody Integer customFieldId) throws Exception {
+        List<CustomOptionVO> customOptionVOS = customOptionService.getCustomOption(customFieldId);
+        Records records = new Records();
+        records.setData(customOptionVOS);
+        return Response.success(records);
+    }
+
+    @Operation(summary = "新增自定义选项")
+    @PostMapping("/addCustomOption")
+    public Response addCustomOption(@RequestBody CustomOptionDTO customOptionDTO) throws Exception {
+        if(customOptionDTO != null){
+            Integer id = null;
+            try {
+                id = customOptionService.addCustomOption(customOptionDTO);
+            } catch (Exception e){
+                if(e instanceof XiaoShiException) {
+                    return Response.error(e.getMessage());
+                } else if (e instanceof UnLoginException) {
+                    return Response.unLogin(e.getMessage());
+                } else if (e instanceof ConditionException) {
+                    return Response.conditionError(e.getMessage());
+                }
+            }
+            return Response.success(id);
+        } else {
+            return Response.error("网络异常");
+        }
+    }
+
+    @Operation(summary = "更新自定义选项")
+    @PostMapping("/updateCustomOption")
+    public Response updateCustomOption(@RequestBody UpdateCustomOptionDTO updateCustomOptionDTO) throws Exception {
+        if (updateCustomOptionDTO != null) {
+            Integer id = customOptionService.updateCustomOption(updateCustomOptionDTO);
+            return Response.success(id);
+        } else {
+            return Response.error("网络异常");
+        }
+    }
+
+    @Operation(summary = "删除自定义选项")
+    @PostMapping("/deleteCustomOption")
+    public Response deleteCustomOption(@RequestBody List<Integer> ids) throws Exception {
+        customOptionService.deleteCustomOption(ids);
+        return Response.success("删除成功");
+    }
+
+}

+ 6 - 6
src/main/java/cn/cslg/pas/domain/business/CustomField.java

@@ -33,18 +33,18 @@ public class CustomField extends BaseEntity<CustomField> {
     private Integer type;
 
     /**
-     * 值选择方式
-     */
-    @TableField(value = "choose_type")
-    private Boolean choose_type;
-
-    /**
      * 描述
      */
     @TableField(value = "description")
     private String description;
 
     /**
+     * 状态
+     */
+    @TableField(value = "status")
+    private Boolean status;
+
+    /**
      * 创建人
      */
     @TableField(value = "create_id")

+ 6 - 0
src/main/java/cn/cslg/pas/mapper/CustomFieldMapper.java

@@ -1,13 +1,19 @@
 package cn.cslg.pas.mapper;
 
+import cn.cslg.pas.common.vo.business.CustomFieldVO;
 import cn.cslg.pas.domain.business.CustomField;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 /**
+ * 自定义栏位Mapper层
  * @Author xiexiang
  * @Date 2023/11/8
  */
 @Repository
 public interface CustomFieldMapper extends BaseMapper<CustomField> {
+    List<CustomFieldVO> getCustomField(String sql1, String sql2, String sql3);
+    Long getCustomFieldCount(String sql);
 }

+ 195 - 1
src/main/java/cn/cslg/pas/service/business/CustomFieldService.java

@@ -1,14 +1,208 @@
 package cn.cslg.pas.service.business;
 
+import cn.cslg.pas.common.dto.business.CustomFieldDTO;
+import cn.cslg.pas.common.dto.business.UpdateCustomFieldDTO;
+import cn.cslg.pas.common.model.cronModel.Personnel;
+import cn.cslg.pas.common.model.cronModel.PersonnelVO;
+import cn.cslg.pas.common.model.cronModel.Records;
+import cn.cslg.pas.common.model.request.GroupRequest;
+import cn.cslg.pas.common.model.request.QueryRequest;
+import cn.cslg.pas.common.utils.CacheUtils;
+import cn.cslg.pas.common.utils.LoginUtils;
+import cn.cslg.pas.common.vo.business.CustomFieldVO;
+import cn.cslg.pas.common.vo.business.ProductVO;
 import cn.cslg.pas.domain.business.CustomField;
+import cn.cslg.pas.exception.UnLoginException;
+import cn.cslg.pas.exception.XiaoShiException;
+import cn.cslg.pas.factorys.businessFactory.Business;
 import cn.cslg.pas.mapper.CustomFieldMapper;
+import cn.cslg.pas.service.permissions.PermissionService;
+import cn.cslg.pas.service.query.FormatQueryService;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
+ * 自定义栏位Service层
  * @Author xiexiang
  * @Date 2023/11/8
  */
 @Service
-public class CustomFieldService extends ServiceImpl<CustomFieldMapper, CustomField> {
+public class CustomFieldService extends ServiceImpl<CustomFieldMapper, CustomField> implements Business {
+
+    @Autowired
+    private CacheUtils cacheUtils;
+
+    @Autowired
+    private LoginUtils loginUtils;
+
+    @Autowired
+    private FormatQueryService formatQueryService;
+
+    @Autowired
+    private CustomFieldMapper customFieldMapper;
+
+    @Autowired
+    private PermissionService permissionService;
+
+    @Override
+    public Object queryMessage(QueryRequest queryRequest) throws Exception {
+        //根据专题库/报告id查询自定义栏位
+        List<String> sqls = formatQueryService.reSqls(queryRequest,"customField");
+        //根据sql查询自定义栏位信息
+        List<CustomFieldVO> customFieldVOS = customFieldMapper.getCustomField(sqls.get(0), sqls.get(1), sqls.get(2));
+        //查询总数
+        Long total = customFieldMapper.getCustomFieldCount(sqls.get(0));
+        //装载自定义栏位信息
+        this.loadCustomField(customFieldVOS);
+        //装载返回信息
+        Records records = new Records();
+        records.setCurrent(queryRequest.getCurrent());
+        records.setSize(queryRequest.getSize());
+        records.setData(customFieldVOS);
+        records.setTotal(total);
+        return records;
+    }
+
+    @Override
+    public Object addMessage(Object object, List<MultipartFile> files) {
+        return null;
+    }
+
+    @Override
+    public Object deleteMessage(List<Integer> ids) throws IOException {
+        if (ids == null || ids.size() == 0) {
+            throw new XiaoShiException("ids不能为空");
+        }
+        this.removeBatchByIds(ids);
+        //TODO 删除与专题库的关联关系
+        return ids;
+    }
+
+    @Override
+    public Object updateMessage(Object object, List<MultipartFile> files) {
+        return null;
+    }
+
+    @Override
+    public Object getGroup(GroupRequest groupRequest, String tableName) throws Exception {
+        return null;
+    }
+
+    @Override
+    public Object addMessage(Object object) {
+        if (object == null) {
+            throw new XiaoShiException("参数不能为空");
+        }
+        //object to customFieldDTO
+        CustomFieldDTO customFieldDTO = (CustomFieldDTO) object;
+        //非空校验
+        if (customFieldDTO.getProjectId().equals(null)) {
+            throw new XiaoShiException("专题库/报告id不能为空!");
+        }
+        if (customFieldDTO.getName().equals(null) || customFieldDTO.getName().equals("")) {
+            throw new XiaoShiException("自定义栏位名称不能为空!");
+        }
+        if (customFieldDTO.getType().equals(null)) {
+            throw new XiaoShiException("自定义栏位类型不能为空!");
+        }
+        String name = customFieldDTO.getName();
+        Integer projectId = customFieldDTO.getProjectId();
+        //检查名称是否规范
+        customFieldDTO.setName(name.trim());
+        //同一个专题库/报告id下名称不能重复
+        LambdaQueryWrapper<CustomField> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(CustomField::getName, name);
+        queryWrapper.eq(CustomField::getProjectId, projectId);
+        List<CustomField> customFields = this.list(queryWrapper);
+        if (customFields != null && customFields.size() != 0) {
+            throw new XiaoShiException("名称不能重复");
+        }
+        //获取登录人信息
+        PersonnelVO personnelVO = new PersonnelVO();
+        try {
+            personnelVO = cacheUtils.getLoginUser(loginUtils.getId());
+        } catch (Exception e) {
+            throw new UnLoginException("未登录");
+        }
+        CustomField customField = new CustomField();
+        BeanUtils.copyProperties(customFieldDTO, customField);
+        customField.setCreateId(personnelVO.getId());
+        customField.insert();
+        return customField.getId();
+    }
+
+    @Override
+    public Object updateMessage(Object object) {
+        if (object == null) {
+            throw new XiaoShiException("参数不能为空");
+        }
+        //object to updateCustomFieldDTO
+        UpdateCustomFieldDTO updateCustomFieldDTO = (UpdateCustomFieldDTO) object;
+        //非空校验
+        if (updateCustomFieldDTO.getProjectId().equals(null)) {
+            throw new XiaoShiException("专题库/报告id不能为空!");
+        }
+        if (updateCustomFieldDTO.getName().equals(null) || updateCustomFieldDTO.getName().equals("")) {
+            throw new XiaoShiException("自定义栏位名称不能为空!");
+        }
+        if (updateCustomFieldDTO.getType().equals(null)) {
+            throw new XiaoShiException("自定义栏位类型不能为空!");
+        }
+        String name = updateCustomFieldDTO.getName();
+        Integer projectId = updateCustomFieldDTO.getProjectId();
+        CustomField customField = this.getById(updateCustomFieldDTO.getId());
+        //检查名称是否规范
+        updateCustomFieldDTO.setName(name.trim());
+        //同一个专题库/报告id下名称不能重复
+        LambdaQueryWrapper<CustomField> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(CustomField::getName, name);
+        queryWrapper.eq(CustomField::getProjectId, projectId);
+        List<CustomField> customFields = this.list(queryWrapper);
+        if (!name.equals(customField.getName()) && customFields.size() != 0) {
+            throw new XiaoShiException("名称重复");
+        }
+        BeanUtils.copyProperties(updateCustomFieldDTO, customField);
+        customField.updateById();
+        return customField.getId();
+    }
+
+    /**
+     * 装载自定义栏位
+     * @param customFieldVOS
+     */
+    private void loadCustomField(List<CustomFieldVO> customFieldVOS) throws IOException {
+        List<String> createIds = new ArrayList<>();
+        customFieldVOS.forEach(
+                item -> {
+                    if (item.getCreateId() != null) {
+                        createIds.add(item.getCreateId());
+                    }
+                }
+        );
+        List<Personnel> personnels = new ArrayList<>();
+        //查询创建人名称
+        if (createIds.size() != 0) {
+            String res = permissionService.getPersonnelByIdsFromPCS(createIds);
+            JSONObject jsonObject = JSONObject.parseObject(res);
+            personnels = JSONObject.parseArray(jsonObject.getString("data"), Personnel.class);
+        }
+        for (CustomFieldVO customFieldVO : customFieldVOS) {
+            //装载人员信息
+            Personnel personnel = personnels.stream().filter(item -> item.getId().equals(customFieldVO.getCreateId())).findFirst().orElse(null);
+            if (personnel != null) {
+                customFieldVO.setCreateName(personnel.getPersonnelName());
+            } else {
+                throw new XiaoShiException("未获取到当前登陆人信息");
+            }
+        }
+    }
 }

+ 131 - 0
src/main/java/cn/cslg/pas/service/business/CustomOptionService.java

@@ -1,14 +1,145 @@
 package cn.cslg.pas.service.business;
 
+import cn.cslg.pas.common.dto.business.CustomOptionDTO;
+import cn.cslg.pas.common.dto.business.UpdateCustomOptionDTO;
+import cn.cslg.pas.common.model.cronModel.Personnel;
+import cn.cslg.pas.common.model.cronModel.PersonnelVO;
+import cn.cslg.pas.common.utils.CacheUtils;
+import cn.cslg.pas.common.utils.LoginUtils;
+import cn.cslg.pas.common.vo.business.CustomOptionVO;
 import cn.cslg.pas.domain.business.CustomOption;
+import cn.cslg.pas.exception.UnLoginException;
+import cn.cslg.pas.exception.XiaoShiException;
 import cn.cslg.pas.mapper.CustomOptionMapper;
+import cn.cslg.pas.service.permissions.PermissionService;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * @Author xiexiang
  * @Date 2023/11/8
  */
 @Service
 public class CustomOptionService extends ServiceImpl<CustomOptionMapper, CustomOption> {
+    @Autowired
+    private CacheUtils cacheUtils;
+
+    @Autowired
+    private LoginUtils loginUtils;
+
+    @Autowired
+    private PermissionService permissionService;
+
+    public Integer addCustomOption(CustomOptionDTO customOptionDTO) {
+        if (customOptionDTO.getName().equals(null)) {
+            throw new XiaoShiException("选项值不能为空!");
+        }
+        if (customOptionDTO.getCustomFieldId().equals(null)) {
+            throw new XiaoShiException("所属自定义栏位不能为空!");
+        }
+        String name = customOptionDTO.getName();
+        //检查名称是否规范
+        customOptionDTO.setName(name.trim());
+        //同一个自定义栏位下值选项不能重复
+        LambdaQueryWrapper<CustomOption> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(CustomOption::getName, name);
+        queryWrapper.eq(CustomOption::getCustomFieldId, customOptionDTO.getCustomFieldId());
+        List<CustomOption> customOptions = this.list(queryWrapper);
+        if (customOptions != null && customOptions.size() != 0) {
+            throw new XiaoShiException("名称不能重复");
+        }
+        //获取登录人信息
+        PersonnelVO personnelVO = new PersonnelVO();
+        try {
+            personnelVO = cacheUtils.getLoginUser(loginUtils.getId());
+        } catch (Exception e) {
+            throw new UnLoginException("未登录");
+        }
+        CustomOption customOption = new CustomOption();
+        BeanUtils.copyProperties(customOptionDTO, customOption);
+        customOption.setCreateId(personnelVO.getId());
+        customOption.insert();
+        return customOption.getId();
+    }
+
+    public Integer updateCustomOption(UpdateCustomOptionDTO updateCustomOptionDTO) {
+        if (updateCustomOptionDTO.getName().equals(null)) {
+            throw new XiaoShiException("选项值不能为空!");
+        }
+        if (updateCustomOptionDTO.getCustomFieldId().equals(null)) {
+            throw new XiaoShiException("所属自定义栏位不能为空!");
+        }
+        String name = updateCustomOptionDTO.getName();
+        CustomOption customOption = this.getById(updateCustomOptionDTO.getId());
+        //检查名称是否规范
+        updateCustomOptionDTO.setName(name.trim());
+        //同一个自定义栏位下值选项不能重复
+        LambdaQueryWrapper<CustomOption> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(CustomOption::getName, name);
+        queryWrapper.eq(CustomOption::getCustomFieldId, updateCustomOptionDTO.getCustomFieldId());
+        List<CustomOption> customOptions = this.list(queryWrapper);
+        if (!name.equals(customOption.getName()) && customOptions.size() != 0) {
+            throw new XiaoShiException("名称重复");
+        }
+        BeanUtils.copyProperties(updateCustomOptionDTO, customOption);
+        customOption.updateById();
+        return customOption.getId();
+    }
+
+    public List<CustomOptionVO> getCustomOption(Integer customFieldId) throws IOException {
+        List<CustomOptionVO> customOptionVOS = new ArrayList<>();
+        if (!customFieldId.equals(null) && customFieldId != 0) {
+            List<String> createIds = new ArrayList<>();
+            LambdaQueryWrapper<CustomOption> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(CustomOption::getCustomFieldId, customFieldId);
+            List<CustomOption> customOptions = this.list(queryWrapper);
+            customOptions.forEach(
+                    item -> {
+                        if (item.getCreateId() != null) {
+                            createIds.add(item.getCreateId());
+                        }
+                    }
+            );
+            List<Personnel> personnels = new ArrayList<>();
+            //查询创建人名称
+            if (createIds.size() != 0) {
+                String res = permissionService.getPersonnelByIdsFromPCS(createIds);
+                JSONObject jsonObject = JSONObject.parseObject(res);
+                personnels = JSONObject.parseArray(jsonObject.getString("data"), Personnel.class);
+            }
+            if (customOptions != null && customOptions.size() != 0) {
+                for (CustomOption customOption : customOptions) {
+                    CustomOptionVO customOptionVO = new CustomOptionVO();
+                    BeanUtils.copyProperties(customOption, customOptionVO);
+                    //装载人员信息
+                    Personnel personnel = personnels.stream().filter(item -> item.getId().equals(customOptionVO.getCreateId())).findFirst().orElse(null);
+                    if (personnel != null) {
+                        customOptionVO.setCreateName(personnel.getPersonnelName());
+                        customOptionVOS.add(customOptionVO);
+                    } else {
+                        throw new XiaoShiException("未获取到创建人信息");
+                    }
+                }
+            }
+        } else {
+            throw new XiaoShiException("错误参数");
+        }
+        return customOptionVOS;
+    }
+
+    public void deleteCustomOption(List<Integer> ids){
+        if (ids != null && ids.size() > 0) {
+            this.removeBatchByIds(ids);
+        } else {
+            throw new XiaoShiException("参数错误");
+        }
+    }
 }

+ 74 - 0
src/main/resources/jsons/customField.json

@@ -0,0 +1,74 @@
+[
+  {"name":"Id",
+    "type":"Integer",
+    "value":"id",
+    "field":"id",
+    "sqlField": "id",
+    "sqlClass": "getComSql",
+    "orderClass": "",
+    "groupClass":"",
+    "ifSearch":"true",
+    "ifGroup": "false",
+    "ifShow":"false"
+  },
+  {"name":"名称",
+  "type":"String",
+  "value":"name",
+  "field": "name",
+  "sqlField": "name",
+  "sqlClass": "getLikeSql",
+    "orderClass": "getComOrder",
+    "groupClass":"getComGroup",
+  "ifSearch":"true",
+  "ifGroup": "false",
+    "ifShow":"true"
+},
+  {"name":"创建人",
+    "type":"String",
+    "value":"createName",
+    "field": "createName",
+    "sqlField": "create_id",
+    "sqlClass": "getCreateNameSql",
+    "orderClass": "getCreateNameOrder",
+    "groupClass":"getComGroup",
+    "ifSearch":"true",
+    "ifGroup": "false",
+    "ifShow":"true"
+
+  },
+  {"name":"创建时间",
+    "type":"DateTime",
+    "value":"createTime",
+    "field": "createTime",
+    "sqlField": "create_time",
+    "sqlClass": "getDateTimeSql",
+    "orderClass": "getComOrder",
+    "groupClass":"getTimeGroup",
+    "ifSearch":"true",
+    "ifGroup": "false",
+    "ifShow":"true"
+  },
+  {"name":"描述",
+    "type":"String",
+    "value":"description",
+    "field": "description",
+    "sqlField": "description",
+    "sqlClass": "getComSql",
+    "orderClass": "getComOrder",
+    "ifSearch":"false",
+    "ifGroup": "false",
+    "ifShow":"true"
+  },
+  {"name":"projectId",
+    "type":"Integer",
+    "value":"projectId",
+    "field":"projectId",
+    "sqlField": "project_id",
+    "sqlClass": "getComSql",
+    "orderClass": "",
+    "groupClass":"",
+    "ifSearch":"true",
+    "ifGroup": "false",
+    "ifShow":"false"
+  }
+]

+ 25 - 0
src/main/resources/mapper/CustomFieldMapper.xml

@@ -0,0 +1,25 @@
+<?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="cn.cslg.pas.mapper.CustomFieldMapper">
+  <select id="getCustomField"  resultType="cn.cslg.pas.common.vo.business.CustomFieldVO">
+   select id,name,description,project_id as projectId,type as type,status,create_id as createId,create_time as createTime from custom_field
+
+
+        <if test="sql1!=''">
+
+        where    ${sql1}
+        </if>
+
+
+      ${sql2} ${sql3}
+  </select>
+
+    <select id="getCustomFieldCount" resultType="java.lang.Long">
+        select count(*) from custom_field
+        <if test="sql!=''">
+
+            where    ${sql}
+        </if>
+    </select>
+
+</mapper>