diff --git a/src/com/api/salary/web/SalaryFieldController.java b/src/com/api/salary/web/SalaryFieldController.java
new file mode 100644
index 000000000..4b576c1d3
--- /dev/null
+++ b/src/com/api/salary/web/SalaryFieldController.java
@@ -0,0 +1,7 @@
+package com.api.salary.web;
+
+import javax.ws.rs.Path;
+
+@Path("/bs/hrmsalary/salaryField")
+public class SalaryFieldController extends com.engine.salary.web.SalaryFieldController{
+}
diff --git a/src/com/engine/salary/entity/salaryitem/dto/SalaryFieldListDTO.java b/src/com/engine/salary/entity/salaryitem/dto/SalaryFieldListDTO.java
new file mode 100644
index 000000000..69663545e
--- /dev/null
+++ b/src/com/engine/salary/entity/salaryitem/dto/SalaryFieldListDTO.java
@@ -0,0 +1,78 @@
+package com.engine.salary.entity.salaryitem.dto;
+
+import com.cloudstore.eccom.pc.table.WeaTableType;
+import com.engine.salary.annotation.SalaryTable;
+import com.engine.salary.annotation.SalaryTableColumn;
+import com.engine.salary.annotation.SalaryTableOperate;
+import com.engine.salary.annotation.TableTitle;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 字段管理列表
+ *
Copyright: Copyright (c) 2022
+ * Company: 泛微软件
+ *
+ * @author qiantao
+ * @version 1.0
+ **/
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@SalaryTable(pageId = "a4f85287-e3f9-ab21-adn9-7d06e54y6r98", tableType = WeaTableType.CHECKBOX, operates = {@SalaryTableOperate(text = "编辑", index = "0"), @SalaryTableOperate(text = "删除", index = "1")})
+public class SalaryFieldListDTO {
+
+ @JsonSerialize(using = ToStringSerializer.class)
+ @SalaryTableColumn(column = "id", display = false)
+ private Long id;
+
+ @SalaryTableColumn(text = "名称", width = "10%", column = "name")
+ @TableTitle(title = "名称",dataIndex = "name",key = "name")
+ private String name;
+
+ //默认使用
+ @SalaryTableColumn(text = "默认使用", width = "10%", column = "useDefault")
+ @TableTitle(title = "默认使用",dataIndex = "useDefault",key = "useDefault")
+ private Integer useDefault;
+
+ //进位规则
+ @SalaryTableColumn(text = "进位规则", width = "10%", column = "roundingMode",transmethod = "com.engine.salary.transmethod.TransMethod.roundingMode")
+ @TableTitle(title = "进位规则",dataIndex = "roundingMode",key = "roundingMode")
+ private String roundingMode;
+
+ //保留小数位
+ @SalaryTableColumn(text = "保留小数位", width = "10%", column = "pattern")
+ @TableTitle(title = "保留小数位",dataIndex = "pattern",key = "pattern")
+ private Integer pattern;
+
+ //取值方式
+ @SalaryTableColumn(text = "取值方式", width = "10%", column = "valueType",transmethod = "com.engine.salary.transmethod.TransMethod.datasource")
+ @TableTitle(title = "取值方式",dataIndex = "valueType",key = "valueType")
+ private String valueType;
+
+ //公式id
+ private Long formulaId;
+
+ //公式内容
+ private String formulaContent;
+
+ //备注
+ @SalaryTableColumn(text = "备注", width = "10%", column = "description")
+ @TableTitle(title = "备注",dataIndex = "description",key = "description")
+ private String description;
+
+
+ //是否可以编辑
+ private Boolean canEdit;
+
+ //是否可以删除
+ private Boolean canDelete;
+
+ @SalaryTableColumn(text = "操作", width = "20%", column = "operate")
+ private String operate;
+}
diff --git a/src/com/engine/salary/web/SalaryFieldController.java b/src/com/engine/salary/web/SalaryFieldController.java
new file mode 100644
index 000000000..9d093a40c
--- /dev/null
+++ b/src/com/engine/salary/web/SalaryFieldController.java
@@ -0,0 +1,88 @@
+package com.engine.salary.web;
+
+import com.engine.common.util.ServiceUtil;
+import com.engine.salary.entity.salaryitem.dto.SalaryItemFormDTO;
+import com.engine.salary.entity.salaryitem.dto.SalaryItemListDTO;
+import com.engine.salary.entity.salaryitem.param.SalaryItemSaveParam;
+import com.engine.salary.entity.salaryitem.param.SalaryItemSearchParam;
+import com.engine.salary.util.ResponseResult;
+import com.engine.salary.util.page.PageInfo;
+import com.engine.salary.wrapper.SalaryFieldWrapper;
+import io.swagger.v3.oas.annotations.parameters.RequestBody;
+import weaver.hrm.HrmUserVarify;
+import weaver.hrm.User;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.ws.rs.*;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import java.util.Collection;
+
+/**
+ * 薪资字段管理
+ * Copyright: Copyright (c) 2022
+ * Company: 泛微软件
+ *
+ * @author qiantao
+ * @version 1.0
+ **/
+public class SalaryFieldController {
+
+ private SalaryFieldWrapper getSalaryFieldWrapper(User user) {
+ return ServiceUtil.getService(SalaryFieldWrapper.class, user);
+ }
+
+ /**
+ * 字段管理列表
+ * @see
+ */
+ @POST
+ @Path("/list")
+ @Produces(MediaType.APPLICATION_JSON)
+ public String listSalaryItem(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryItemSearchParam searchParam) {
+ User user = HrmUserVarify.getUser(request, response);
+ return new ResponseResult>(user).run(getSalaryFieldWrapper(user)::listPage, searchParam);
+ }
+
+
+ /**
+ * 字段管理详情
+ * @see
+ */
+ @GET
+ @Path("/getSalaryForm")
+ @Produces(MediaType.APPLICATION_JSON)
+ public String getSalaryItemForm(@Context HttpServletRequest request, @Context HttpServletResponse response, @QueryParam(value = "id") Long id) {
+ User user = HrmUserVarify.getUser(request, response);
+ return new ResponseResult(user).run(getSalaryFieldWrapper(user)::getForm, id);
+ }
+
+ /**
+ * 删除
+ * @see
+ */
+ @POST
+ @Path("/delete")
+ @Produces(MediaType.APPLICATION_JSON)
+ public String deleteSalaryItem(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody Collection ids) {
+ User user = HrmUserVarify.getUser(request, response);
+ return new ResponseResult, String>(user).run(getSalaryFieldWrapper(user)::delete, ids);
+ }
+
+ /**
+ * 保存字段管理
+ * @see
+ */
+ @POST
+ @Path("/save")
+ @Produces(MediaType.APPLICATION_JSON)
+ public String saveSalaryItem(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryItemSaveParam saveParam) {
+ User user = HrmUserVarify.getUser(request, response);
+ if (saveParam.getId() == null || saveParam.getId() <= 0) {
+ return new ResponseResult(user).run(getSalaryFieldWrapper(user)::save, saveParam);
+ } else {
+ return new ResponseResult(user).run(getSalaryFieldWrapper(user)::update, saveParam);
+ }
+ }
+}
diff --git a/src/com/engine/salary/wrapper/SalaryFieldWrapper.java b/src/com/engine/salary/wrapper/SalaryFieldWrapper.java
new file mode 100644
index 000000000..938e32b34
--- /dev/null
+++ b/src/com/engine/salary/wrapper/SalaryFieldWrapper.java
@@ -0,0 +1,199 @@
+package com.engine.salary.wrapper;
+
+import com.engine.common.util.ServiceUtil;
+import com.engine.core.impl.Service;
+import com.engine.salary.entity.salaryformula.ExpressFormula;
+import com.engine.salary.entity.salaryitem.bo.SalaryItemBO;
+import com.engine.salary.entity.salaryitem.dto.SalaryFieldListDTO;
+import com.engine.salary.entity.salaryitem.dto.SalaryItemFormDTO;
+import com.engine.salary.entity.salaryitem.dto.SalaryItemListDTO;
+import com.engine.salary.entity.salaryitem.param.SalaryItemSaveParam;
+import com.engine.salary.entity.salaryitem.param.SalaryItemSearchParam;
+import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
+import com.engine.salary.entity.salarysob.po.SalarySobItemPO;
+import com.engine.salary.enums.SalaryOnOffEnum;
+import com.engine.salary.enums.SalaryRoundingModeEnum;
+import com.engine.salary.enums.SalarySystemTypeEnum;
+import com.engine.salary.enums.SalaryValueTypeEnum;
+import com.engine.salary.enums.salaryitem.SalaryDataTypeEnum;
+import com.engine.salary.exception.SalaryRunTimeException;
+import com.engine.salary.service.SalaryFormulaService;
+import com.engine.salary.service.SalaryItemService;
+import com.engine.salary.service.SalarySobItemService;
+import com.engine.salary.service.impl.SalaryFormulaServiceImpl;
+import com.engine.salary.service.impl.SalaryItemServiceImpl;
+import com.engine.salary.service.impl.SalarySobItemServiceImpl;
+import com.engine.salary.util.SalaryEntityUtil;
+import com.engine.salary.util.SalaryI18nUtil;
+import com.engine.salary.util.page.Column;
+import com.engine.salary.util.page.PageInfo;
+import com.engine.salary.util.valid.RuntimeTypeEnum;
+import com.engine.salary.util.valid.ValidUtil;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang.math.NumberUtils;
+import weaver.hrm.User;
+
+import java.util.*;
+
+/**
+ * 字段管理
+ * Copyright: Copyright (c) 2022
+ * Company: 泛微软件
+ *
+ * @author qiantao
+ * @version 1.0
+ **/
+public class SalaryFieldWrapper extends Service {
+
+ private SalaryItemService getSalaryItemService(User user) {
+ return (SalaryItemService) ServiceUtil.getService(SalaryItemServiceImpl.class, user);
+ }
+
+ private SalaryFormulaService getSalaryFormulaService(User user) {
+ return (SalaryFormulaService) ServiceUtil.getService(SalaryFormulaServiceImpl.class, user);
+ }
+
+
+ private SalarySobItemService getSalarySobItemService(User user) {
+ return (SalarySobItemService) ServiceUtil.getService(SalarySobItemServiceImpl.class, user);
+ }
+
+ /**
+ * 薪资项目列表
+ *
+ * @param searchParam 查询参数
+ * @return
+ */
+ public PageInfo listPage(SalaryItemSearchParam searchParam) {
+ // 1、查询薪资项目
+ //设置查询档案引用项目
+ searchParam.setUseInEmployeeSalary(SalaryOnOffEnum.ON.getValue());
+
+ PageInfo page = getSalaryItemService(user).listPageByParam(searchParam);
+ List salaryItemList = page.getList();
+
+ //最终返回的分页对象
+ PageInfo salaryItemListDTOPage = new PageInfo<>(SalaryItemListDTO.class);
+ salaryItemListDTOPage.setPageSize(page.getPageSize());
+ salaryItemListDTOPage.setPageNum(page.getPageNum());
+ salaryItemListDTOPage.setTotal(page.getTotal());
+ //获取字段管理的字段列表
+ PageInfo fieldColumnsPage = new PageInfo<>(SalaryFieldListDTO.class);
+ List fieldColumns = fieldColumnsPage.getColumns();
+ salaryItemListDTOPage.getColumns().clear();
+ salaryItemListDTOPage.setColumns(fieldColumns);
+
+ // 被薪资账套引用的薪资项目
+ List salarySobItems = new ArrayList<>();
+ if (CollectionUtils.isNotEmpty(salaryItemList)) {
+ //2、填充公式内容
+ Set formulaIds = SalaryEntityUtil.properties(salaryItemList, SalaryItemPO::getFormulaId);
+ List expressFormulas = getSalaryFormulaService(user).listExpressFormula(formulaIds);
+ // 转换成薪资项目列表dto
+ List salaryItemListDTOS = SalaryItemBO.convert2ListDTO(salaryItemList, expressFormulas, Collections.emptyList());
+ //薪资档案引用时不能删除
+ salaryItemListDTOS.forEach(dto -> {
+ if (dto.getUseInEmployeeSalary() == 1) {
+ dto.setCanDelete(false);
+ }
+ });
+ //3、被引用的薪资项目不能删除
+ Set salaryItemIds = SalaryEntityUtil.properties(salaryItemList, SalaryItemPO::getId);
+ salarySobItems = getSalarySobItemService(user).listBySalaryItemIds(salaryItemIds);
+ if (CollectionUtils.isNotEmpty(salarySobItems)) {
+ Set salaryItemIdsUseBySob = SalaryEntityUtil.properties(salarySobItems, SalarySobItemPO::getSalaryItemId);
+ salaryItemListDTOS.forEach(dto -> {
+ if (salaryItemIdsUseBySob.contains(dto.getId())) {
+ dto.setCanDelete(false);
+ }
+ });
+ }
+ salaryItemListDTOPage.setList(salaryItemListDTOS);
+ }
+
+ return salaryItemListDTOPage;
+
+ }
+
+ /**
+ * 薪资项目详情
+ *
+ * @param id 主键id
+ * @return
+ */
+ public SalaryItemFormDTO getForm(Long id) {
+ SalaryItemFormDTO salaryItemFormDTO = new SalaryItemFormDTO();
+ // 默认可以编辑
+ salaryItemFormDTO.setCanEdit(NumberUtils.INTEGER_ONE);
+ if (!Objects.isNull(id)) {
+ // 查询薪资项目
+ SalaryItemPO salaryItemPO = getSalaryItemService(user).getById(id);
+ // 系统薪资项目
+ if (Objects.isNull(salaryItemPO)) {
+ throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98299, "参数错误,薪资项目不存在或已被删除"));
+ }
+ ExpressFormula expressFormula;
+// // 转换成薪资项目详情dto
+
+ salaryItemFormDTO = SalaryItemBO.convert2FormDTO(salaryItemPO);
+ expressFormula = getSalaryFormulaService(user).getExpressFormula(salaryItemPO.getFormulaId());
+ salaryItemFormDTO.setFormulaContent(Optional.ofNullable(expressFormula).map(ExpressFormula::getFormula).orElse(""));
+ }
+ return salaryItemFormDTO;
+ }
+
+ /**
+ * 保存薪资项目
+ *
+ * @param saveParam 保存参数
+ */
+ public void save(SalaryItemSaveParam saveParam) {
+ saveParam.setValueType(SalaryValueTypeEnum.INPUT.getValue());
+ saveParam.setUseInEmployeeSalary(NumberUtils.INTEGER_ONE);
+ saveParam.setSystemType(SalarySystemTypeEnum.CUSTOM.getValue());
+
+ ValidUtil.doValidator(saveParam);
+ validParam(saveParam);
+
+ getSalaryItemService(user).save(saveParam);
+ }
+
+ private void validParam(SalaryItemSaveParam saveParam) {
+ if (SalarySystemTypeEnum.parseByValue(saveParam.getSystemType()) == null) {
+ throw new SalaryRunTimeException("系统内置的薪资项目异常");
+ }
+ if (SalaryRoundingModeEnum.parseByValue(saveParam.getRoundingMode()) == null) {
+ throw new SalaryRunTimeException("舍入规则异常");
+ }
+ if (SalaryValueTypeEnum.parseByValue(saveParam.getValueType()) == null) {
+ throw new SalaryRunTimeException("取值方式异常");
+ }
+ if (SalaryDataTypeEnum.parseByValue(saveParam.getDataType()) == null) {
+ throw new SalaryRunTimeException("字段类型异常");
+ }
+ }
+
+ /**
+ * 编辑薪资项目
+ *
+ * @param saveParam 更新参数
+ */
+ public void update(SalaryItemSaveParam saveParam) {
+ saveParam.setValueType(SalaryValueTypeEnum.INPUT.getValue());
+ saveParam.setUseInEmployeeSalary(NumberUtils.INTEGER_ONE);
+ saveParam.setSystemType(SalarySystemTypeEnum.CUSTOM.getValue());
+
+ ValidUtil.doValidator(saveParam, RuntimeTypeEnum.UPDATE);
+ validParam(saveParam);
+ getSalaryItemService(user).update(saveParam);
+ }
+
+ /**
+ * 删除薪资项目
+ *
+ * @param ids 主键id
+ */
+ public void delete(Collection ids) {
+ getSalaryItemService(user).deleteByIds(ids);
+ }
+}