소스 검색

add:服务单元管理

caozixuan 1 년 전
부모
커밋
100baef895

+ 119 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/params/ServiceUnitParam.java

@@ -0,0 +1,119 @@
+package com.qmth.sop.business.bean.params;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.sop.business.annotation.EditKey;
+import com.qmth.sop.common.enums.ProductTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+import org.hibernate.validator.constraints.Range;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Description: 服务单元参数
+ * @Author: CaoZixuan
+ * @Date: 2023-08-08
+ */
+public class ServiceUnitParam {
+    @EditKey
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long id;
+
+    @ApiModelProperty(value = "名称")
+    @NotNull(message = "请提供服务单元名称")
+    private String name;
+
+    @ApiModelProperty(value = "类型,OFFICE:教务处,CLOUD_MARK:云阅卷")
+    @NotNull(message = "请提供服务单元类型")
+    private ProductTypeEnum type;
+
+    @ApiModelProperty(value = "开始时间")
+    @NotNull(message = "请提供服务开始时间")
+    @Range(min = 1L, message = "请提供服务开始时间")
+    private Long startTime;
+
+    @ApiModelProperty(value = "结束时间")
+    @NotNull(message = "请提供服务结束时间")
+    @Range(min = 1L, message = "请提供服务结束时间")
+    private Long endTime;
+
+    @ApiModelProperty(value = "区域协调人数量")
+    @NotNull(message = "请提供区域协调人数量比例")
+    @Range(min = 1L, message = "请提供区域协调人数量比例")
+    private Integer regionPeopleCount;
+
+    @ApiModelProperty(value = "区域项目数量")
+    @NotNull(message = "请提供项目数量比例")
+    @Range(min = 1L, message = "请提供项目数量比例")
+    private Integer regionProjectCount;
+
+    @ApiModelProperty(value = "服务单元负责人id")
+    @NotNull(message = "请提供服务负责人")
+    @Range(min = 1L, message = "请提供服务负责人")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long serviceLeadId;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public ProductTypeEnum getType() {
+        return type;
+    }
+
+    public void setType(ProductTypeEnum type) {
+        this.type = type;
+    }
+
+    public Long getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Long startTime) {
+        this.startTime = startTime;
+    }
+
+    public Long getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Long endTime) {
+        this.endTime = endTime;
+    }
+
+    public Integer getRegionPeopleCount() {
+        return regionPeopleCount;
+    }
+
+    public void setRegionPeopleCount(Integer regionPeopleCount) {
+        this.regionPeopleCount = regionPeopleCount;
+    }
+
+    public Integer getRegionProjectCount() {
+        return regionProjectCount;
+    }
+
+    public void setRegionProjectCount(Integer regionProjectCount) {
+        this.regionProjectCount = regionProjectCount;
+    }
+
+    public Long getServiceLeadId() {
+        return serviceLeadId;
+    }
+
+    public void setServiceLeadId(Long serviceLeadId) {
+        this.serviceLeadId = serviceLeadId;
+    }
+}

+ 32 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/result/ReductionResult.java

@@ -0,0 +1,32 @@
+package com.qmth.sop.business.bean.result;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 约分结果
+ * @Author: CaoZixuan
+ * @Date: 2023-08-08
+ */
+public class ReductionResult {
+    @ApiModelProperty("分子")
+    private Integer molecular;
+
+    @ApiModelProperty("分母")
+    private Integer denominator;
+
+    public Integer getMolecular() {
+        return molecular;
+    }
+
+    public void setMolecular(Integer molecular) {
+        this.molecular = molecular;
+    }
+
+    public Integer getDenominator() {
+        return denominator;
+    }
+
+    public void setDenominator(Integer denominator) {
+        this.denominator = denominator;
+    }
+}

+ 158 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/result/ServiceUnitResult.java

@@ -0,0 +1,158 @@
+package com.qmth.sop.business.bean.result;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.sop.common.enums.ProductTypeEnum;
+import com.qmth.sop.common.enums.ServiceStatusEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 服务单元管理查询结果
+ * @Author: CaoZixuan
+ * @Date: 2023-08-08
+ */
+public class ServiceUnitResult {
+    @ApiModelProperty("服务单元id")
+    private Long id;
+
+    @ApiModelProperty(value = "服务单元名称")
+    private String name;
+
+    @ApiModelProperty(value = "开始时间")
+    private Long startTime;
+
+    @ApiModelProperty(value = "结束时间")
+    private Long endTime;
+
+    @ApiModelProperty(value = "类型,OFFICE:教务处,CLOUD_MARK:云阅卷")
+    private ProductTypeEnum type;
+
+    @ApiModelProperty(value = "服务单元负责人id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long serviceLeadId;
+
+    @ApiModelProperty(value = "服务单元负责人名称")
+    private String serviceLeadName;
+
+    @ApiModelProperty(value = "区域协调人数量")
+    private Integer regionPeopleCount;
+
+    @ApiModelProperty(value = "区域项目数量")
+    private Integer regionProjectCount;
+
+    @ApiModelProperty(value = "区域配比")
+    private String rate;
+
+    @ApiModelProperty(value = "状态,NEW:新建,PUBLISH:已发布,FINISH:已完结,CANCEL:已作废")
+    private ServiceStatusEnum status;
+
+    @ApiModelProperty(value = "创建人")
+    private String creatorName;
+
+    @ApiModelProperty(value = "创建时间")
+    private Long createTime;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Long getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Long startTime) {
+        this.startTime = startTime;
+    }
+
+    public Long getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Long endTime) {
+        this.endTime = endTime;
+    }
+
+    public ProductTypeEnum getType() {
+        return type;
+    }
+
+    public void setType(ProductTypeEnum type) {
+        this.type = type;
+    }
+
+    public Long getServiceLeadId() {
+        return serviceLeadId;
+    }
+
+    public void setServiceLeadId(Long serviceLeadId) {
+        this.serviceLeadId = serviceLeadId;
+    }
+
+    public String getServiceLeadName() {
+        return serviceLeadName;
+    }
+
+    public void setServiceLeadName(String serviceLeadName) {
+        this.serviceLeadName = serviceLeadName;
+    }
+
+    public Integer getRegionPeopleCount() {
+        return regionPeopleCount;
+    }
+
+    public void setRegionPeopleCount(Integer regionPeopleCount) {
+        this.regionPeopleCount = regionPeopleCount;
+    }
+
+    public Integer getRegionProjectCount() {
+        return regionProjectCount;
+    }
+
+    public void setRegionProjectCount(Integer regionProjectCount) {
+        this.regionProjectCount = regionProjectCount;
+    }
+
+    public String getRate() {
+        return rate;
+    }
+
+    public void setRate(String rate) {
+        this.rate = rate;
+    }
+
+    public ServiceStatusEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(ServiceStatusEnum status) {
+        this.status = status;
+    }
+
+    public String getCreatorName() {
+        return creatorName;
+    }
+
+    public void setCreatorName(String creatorName) {
+        this.creatorName = creatorName;
+    }
+
+    public Long getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Long createTime) {
+        this.createTime = createTime;
+    }
+}

+ 26 - 0
sop-business/src/main/java/com/qmth/sop/business/mapper/TBServiceMapper.java

@@ -1,7 +1,14 @@
 package com.qmth.sop.business.mapper;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qmth.sop.business.bean.result.ServiceUnitResult;
+import com.qmth.sop.business.bean.result.SysLogResult;
 import com.qmth.sop.business.entity.TBService;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qmth.sop.common.enums.ProductTypeEnum;
+import com.qmth.sop.common.enums.ServiceStatusEnum;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * <p>
@@ -12,5 +19,24 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  * @since 2023-08-01
  */
 public interface TBServiceMapper extends BaseMapper<TBService> {
+    /**
+     * 服务单元分页查询
+     *
+     * @param iPage           分页参数
+     * @param type            业务类型
+     * @param serviceLeadId   负责人
+     * @param status          当前状态
+     * @param createStartTime 创建开始时间
+     * @param creatEndTime    创建结束时间
+     * @param serviceUnitName 服务单元名称
+     * @return 分页查询结果
+     */
+    IPage<ServiceUnitResult> findServiceUnitPage(@Param("iPage") Page<SysLogResult> iPage,
+                                                 @Param("type") ProductTypeEnum type,
+                                                 @Param("serviceLeadId") Long serviceLeadId,
+                                                 @Param("status") ServiceStatusEnum status,
+                                                 @Param("createStartTime") Long createStartTime,
+                                                 @Param("createEndTime") Long creatEndTime,
+                                                 @Param("serviceUnitName") String serviceUnitName);
 
 }

+ 60 - 1
sop-business/src/main/java/com/qmth/sop/business/service/TBServiceService.java

@@ -1,7 +1,13 @@
 package com.qmth.sop.business.service;
 
-import com.qmth.sop.business.entity.TBService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.sop.business.bean.params.ServiceUnitParam;
+import com.qmth.sop.business.bean.result.ServiceUnitResult;
+import com.qmth.sop.business.entity.SysUser;
+import com.qmth.sop.business.entity.TBService;
+import com.qmth.sop.common.enums.ProductTypeEnum;
+import com.qmth.sop.common.enums.ServiceStatusEnum;
 
 import java.util.List;
 
@@ -16,4 +22,57 @@ import java.util.List;
 public interface TBServiceService extends IService<TBService> {
 
     List<TBService> listEnable(Long id);
+
+    /**
+     * 服务单元编辑
+     *
+     * @param serviceUnitParam 服务单元参数
+     * @param requestUser      请求用户
+     * @return 编辑结果
+     */
+    Long edit(ServiceUnitParam serviceUnitParam, SysUser requestUser);
+
+    /**
+     * 服务单元分页查询
+     *
+     * @param type            业务类型
+     * @param serviceLeadId   负责人
+     * @param status          服务状态
+     * @param createStartTime 创建开始时间
+     * @param createEndTime   创建截止时间
+     * @param serviceUnitName 服务单元名称
+     * @param pageNumber      分页页数
+     * @param pageSize        分页容量
+     * @return 服务单元分页结果
+     */
+    IPage<ServiceUnitResult> page(ProductTypeEnum type, Long serviceLeadId, ServiceStatusEnum status,
+                                  Long createStartTime, Long createEndTime, String serviceUnitName, Integer pageNumber, Integer pageSize);
+
+    /**
+     * 服务单元作废
+     *
+     * @param serviceUnitId 服务单元id
+     */
+    void cancelServiceUnit(Long serviceUnitId);
+
+    /**
+     * 发布服务单元
+     *
+     * @param serviceUnitId 服务单元id
+     */
+    void publishServiceUnit(Long serviceUnitId);
+
+    /**
+     * 关闭服务单元
+     *
+     * @param serviceUnitId 服务单元id
+     */
+    void clozeServiceUnit(Long serviceUnitId);
+
+    /**
+     * 重启服务单元
+     *
+     * @param serviceUnitId 服务单元id
+     */
+    void restartServiceUnit(Long serviceUnitId);
 }

+ 173 - 3
sop-business/src/main/java/com/qmth/sop/business/service/impl/TBServiceServiceImpl.java

@@ -1,13 +1,31 @@
 package com.qmth.sop.business.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.sop.business.bean.params.ServiceUnitParam;
+import com.qmth.sop.business.bean.result.ReductionResult;
+import com.qmth.sop.business.bean.result.ServiceUnitResult;
+import com.qmth.sop.business.entity.SysRole;
+import com.qmth.sop.business.entity.SysUser;
 import com.qmth.sop.business.entity.TBService;
 import com.qmth.sop.business.mapper.TBServiceMapper;
+import com.qmth.sop.business.service.SysUserRoleService;
 import com.qmth.sop.business.service.TBServiceService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.sop.common.contant.SystemConstant;
+import com.qmth.sop.common.enums.ExceptionResultEnum;
+import com.qmth.sop.common.enums.ProductTypeEnum;
+import com.qmth.sop.common.enums.RoleTypeEnum;
+import com.qmth.sop.common.enums.ServiceStatusEnum;
+import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import javax.annotation.Resource;
 import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -19,9 +37,161 @@ import java.util.List;
  */
 @Service
 public class TBServiceServiceImpl extends ServiceImpl<TBServiceMapper, TBService> implements TBServiceService {
+    @Resource
+    private SysUserRoleService sysUserRoleService;
 
     @Override
     public List<TBService> listEnable(Long id) {
-        return this.list(new QueryWrapper<TBService>().lambda().eq(TBService::getEnable,true).eq(TBService::getId,id));
+        return this.list(new QueryWrapper<TBService>().lambda().eq(TBService::getEnable, true).eq(TBService::getId, id));
+    }
+
+    @Transactional
+    @Override
+    public Long edit(ServiceUnitParam serviceUnitParam, SysUser requestUser) {
+        Long id = serviceUnitParam.getId();
+        Long leaderId = serviceUnitParam.getServiceLeadId();
+        Long startTime = serviceUnitParam.getStartTime();
+        Long endTime = serviceUnitParam.getEndTime();
+
+        Integer regionPeopleCount = serviceUnitParam.getRegionPeopleCount();
+        Integer regionProjectCount = serviceUnitParam.getRegionProjectCount();
+        ReductionResult reduction = this.reduction(regionPeopleCount, regionProjectCount);
+
+
+        if (endTime < startTime) {
+            throw ExceptionResultEnum.ERROR.exception("服务截止时间不能小于服务开始时间");
+        }
+        List<SysRole> sysRoleList = sysUserRoleService.listRoleByUserId(leaderId);
+        if (CollectionUtils.isNotEmpty(sysRoleList)) {
+            if (!sysRoleList.stream().map(SysRole::getType).collect(Collectors.toList()).contains(RoleTypeEnum.BUSSINESS)) {
+                throw ExceptionResultEnum.ERROR.exception("不包含'业务线负责人'角色的用户不能充当服务单元的负责人");
+            }
+        } else {
+            throw ExceptionResultEnum.ERROR.exception("不包含'业务线负责人'角色的用户不能充当服务单元负责人");
+        }
+
+        TBService tbService = new TBService();
+        tbService.setName(serviceUnitParam.getName());
+        tbService.setType(serviceUnitParam.getType());
+        tbService.setStartTime(serviceUnitParam.getStartTime());
+        tbService.setEndTime(serviceUnitParam.getEndTime());
+        tbService.setRegionPeopleCount(reduction.getMolecular());
+        tbService.setRegionProjectCount(reduction.getDenominator());
+        tbService.setServiceLeadId(serviceUnitParam.getServiceLeadId());
+        if (Objects.isNull(id)) {
+            // id不存在新增
+            tbService.setEnable(true);
+            tbService.setStatus(ServiceStatusEnum.NEW);
+            this.save(tbService);
+            id = tbService.getId();
+        } else {
+            // id存在更新
+            tbService.setId(id);
+            this.updateById(tbService);
+        }
+        return id;
+    }
+
+    @Override
+    public IPage<ServiceUnitResult> page(ProductTypeEnum type, Long serviceLeadId, ServiceStatusEnum status,
+                                         Long createStartTime, Long createEndTime, String serviceUnitName, Integer pageNumber, Integer pageSize) {
+        if (serviceUnitName != null && serviceUnitName.length() > 0) {
+            serviceUnitName = SystemConstant.translateSpecificSign(serviceUnitName);
+        }
+        return this.baseMapper.findServiceUnitPage(new Page<>(pageNumber, pageSize), type, serviceLeadId, status, createStartTime, createEndTime, serviceUnitName);
+    }
+
+    @Transactional
+    @Override
+    public void cancelServiceUnit(Long serviceUnitId) {
+        TBService tbService = this.getById(serviceUnitId);
+        if (Objects.isNull(tbService)) {
+            throw ExceptionResultEnum.ERROR.exception("未找到服务单元");
+        }
+        ServiceStatusEnum status = tbService.getStatus();
+        if (!ServiceStatusEnum.NEW.equals(status)) {
+            throw ExceptionResultEnum.ERROR.exception(String.format("只有[%s]状态的服务单元可以被删除,当前状态[%s]", ServiceStatusEnum.NEW, status));
+        }
+        tbService.setStatus(ServiceStatusEnum.CANCEL);
+        tbService.setEnable(false);
+        this.updateById(tbService);
+    }
+
+    @Transactional
+    @Override
+    public void publishServiceUnit(Long serviceUnitId) {
+        TBService tbService = this.getById(serviceUnitId);
+        if (Objects.isNull(tbService)) {
+            throw ExceptionResultEnum.ERROR.exception("未找到服务单元");
+        }
+        ServiceStatusEnum status = tbService.getStatus();
+        if (!ServiceStatusEnum.NEW.equals(status)) {
+            throw ExceptionResultEnum.ERROR.exception(String.format("只有[%s]状态的服务单元可以被发布,当前状态[%s]", ServiceStatusEnum.NEW, status));
+        }
+        // TODO: 2023/8/8 业务校验 服务单元完成了相关准备工作:服务范围划定、供应商划定
+        tbService.setStatus(ServiceStatusEnum.PUBLISH);
+        this.updateById(tbService);
+    }
+
+    @Transactional
+    @Override
+    public void clozeServiceUnit(Long serviceUnitId) {
+        TBService tbService = this.getById(serviceUnitId);
+        if (Objects.isNull(tbService)) {
+            throw ExceptionResultEnum.ERROR.exception("未找到服务单元");
+        }
+        ServiceStatusEnum status = tbService.getStatus();
+        if (!ServiceStatusEnum.PUBLISH.equals(status)) {
+            throw ExceptionResultEnum.ERROR.exception(String.format("只有[%s]状态的服务单元可以被关闭,当前状态[%s]", ServiceStatusEnum.PUBLISH, status));
+        }
+        tbService.setStatus(ServiceStatusEnum.FINISH);
+        this.updateById(tbService);
+    }
+
+    @Transactional
+    @Override
+    public void restartServiceUnit(Long serviceUnitId) {
+        TBService tbService = this.getById(serviceUnitId);
+        if (Objects.isNull(tbService)) {
+            throw ExceptionResultEnum.ERROR.exception("未找到服务单元");
+        }
+        ServiceStatusEnum status = tbService.getStatus();
+        if (!ServiceStatusEnum.FINISH.equals(status)) {
+            throw ExceptionResultEnum.ERROR.exception(String.format("只有[%s]状态的服务单元可以被重启,当前状态[%s]", ServiceStatusEnum.FINISH, status));
+        }
+        tbService.setStatus(ServiceStatusEnum.PUBLISH);
+        this.updateById(tbService);
+    }
+
+    /**
+     * 约分
+     *
+     * @param molecular   分子   eg.10
+     * @param denominator 分母   eg.8
+     * @return 约分后的结果 map -> k:分子 v:分母  eg. map->(5,4)
+     */
+    private ReductionResult reduction(Integer molecular, Integer denominator) {
+        if (SystemConstant.isOneNull(molecular, denominator)) {
+            throw ExceptionResultEnum.ERROR.exception("约分失败,分子或分母不能为空");
+        }
+
+        int min = (molecular < denominator) ? molecular : denominator;
+        int max = (molecular > denominator) ? molecular : denominator;
+
+        if (max % min != 0) {
+            min = min / 2 + 1;
+        }
+
+        int maxMultiple = 1;
+        for (int i = min; i > 1; i--) {
+            if (molecular % i == 0 && denominator % i == 0) {
+                maxMultiple = i;
+                break;
+            }
+        }
+        ReductionResult result = new ReductionResult();
+        result.setMolecular(molecular / maxMultiple);
+        result.setDenominator(denominator / maxMultiple);
+        return result;
     }
-}
+}

+ 46 - 0
sop-business/src/main/resources/mapper/TBServiceMapper.xml

@@ -2,4 +2,50 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.qmth.sop.business.mapper.TBServiceMapper">
 
+    <select id="findServiceUnitPage" resultType="com.qmth.sop.business.bean.result.ServiceUnitResult">
+        SELECT
+            tbs.id,
+            tbs.name,
+            tbs.start_time AS startTime,
+            tbs.end_time AS endTime,
+            tbs.type,
+            tbs.service_lead_id AS serviceLeadId,
+            leader.real_name AS serviceLeadName,
+            tbs.region_people_count AS regionPeopleCount,
+            tbs.region_project_count AS regionProjectCount,
+            CONCAT(tbs.region_people_count,
+                   ':',
+                   tbs.region_project_count) AS rate,
+            tbs.status,
+            creator.real_name AS realName,
+            tbs.create_time AS createTime
+        FROM
+            t_b_service tbs
+                LEFT JOIN
+            sys_user leader ON tbs.service_lead_id = leader.id
+                LEFT JOIN
+            sys_user creator ON tbs.create_id = creator.id
+        <where>
+            AND tbs.enable
+            <if test="type != null">
+                AND tbs.type = #{type}
+            </if>
+            <if test="serviceLeadId != null">
+                AND tbs.service_lead_id = #{serviceLeadId}
+            </if>
+            <if test="status != null">
+                AND tbs.status = #{status}
+            </if>
+            <if test="createStartTime != null">
+                AND tbs.create_time >= #{createStartTime}
+            </if>
+            <if test="createEndTime != null">
+                AND  #{createEndTime} >= tbs.create_time
+            </if>
+            <if test="serviceUnitName != null and serviceUnitName != ''">
+                AND tbs.name LIKE CONCAT('%',#{serviceUnitName},'%')
+            </if>
+        </where>
+        ORDER BY tbs.create_time DESC
+    </select>
 </mapper>

+ 45 - 0
sop-common/src/main/java/com/qmth/sop/common/contant/SystemConstant.java

@@ -16,6 +16,9 @@ import java.nio.charset.Charset;
 import java.time.Duration;
 import java.time.LocalDateTime;
 import java.time.ZoneOffset;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
 import java.util.StringJoiner;
 
 /**
@@ -131,6 +134,7 @@ public class SystemConstant {
     public static final String PREFIX_URL_LOG = "/sys/log";
     public static final String PREFIX_URL_NOTICE = "/sys/notice";
     public static final String PREFIX_URL_MESSAGE = "/sys/message";
+    public static final String PREFIX_URL_SERVICE_UNIT = "/service/unit";
     public static final String PREFIX_URL_ROLE = "/admin/role";
 
     /**
@@ -290,6 +294,16 @@ public class SystemConstant {
         return newDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
     }
 
+    /**
+     * string id 转化为long
+     *
+     * @param id string id
+     * @return long id
+     */
+    public static Long convertIdToLong(String id) {
+        return Objects.nonNull(id) && id.length() > 0 ? Long.parseLong(id) : null;
+    }
+
     /**
      * 模糊查询时调用以去除符号"%","_"特殊字符对查询结果的影响
      *
@@ -308,4 +322,35 @@ public class SystemConstant {
         }
         return param;
     }
+
+    /**
+     * 参数只要有一个为空?
+     *
+     * @param objects 参数
+     * @return true:只要有一个为空;false: 全部非空
+     */
+    public static boolean isOneNull(Object... objects) {
+        boolean result = false;
+        for (Object object : objects) {
+            if (Objects.isNull(object)) {
+                result = true;
+            } else if (object instanceof String) {
+                String param = String.valueOf(object);
+                if (param.length() == 0 || param.equals("null")) {
+                    result = true;
+                }
+            } else if (object instanceof Long) {
+                Long param = SystemConstant.convertIdToLong(String.valueOf(object));
+                if (param == null || param == 0) {
+                    result = true;
+                }
+            } else if (object instanceof Integer) {
+                int param = Integer.parseInt(String.valueOf(object));
+                if (param == 0) {
+                    result = true;
+                }
+            }
+        }
+        return result;
+    }
 }

+ 35 - 1
sop-server/src/main/java/com/qmth/sop/server/api/TBServiceController.java

@@ -1,10 +1,25 @@
 package com.qmth.sop.server.api;
 
 
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.sop.business.bean.result.SysLogResult;
+import com.qmth.sop.business.service.TBServiceService;
+import com.qmth.sop.common.contant.SystemConstant;
+import com.qmth.sop.common.enums.ProductTypeEnum;
+import com.qmth.sop.common.enums.ServiceStatusEnum;
+import com.qmth.sop.common.util.Result;
+import com.qmth.sop.common.util.ResultUtil;
+import io.swagger.annotations.*;
 import org.springframework.web.bind.annotation.RequestMapping;
 
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+
 /**
  * <p>
  * 服务单元表 前端控制器
@@ -13,8 +28,27 @@ import org.springframework.web.bind.annotation.RestController;
  * @author wangliang
  * @since 2023-08-01
  */
+@Api(tags = "服务单元管理前端控制器")
 @RestController
-@RequestMapping("/t-bservice")
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_SERVICE_UNIT)
 public class TBServiceController {
+    @Resource
+    private TBServiceService tbServiceService;
+
+    @ApiOperation(value = "服务单元管理-分页查询")
+    @RequestMapping(value = "/page", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = SysLogResult.class)})
+    public Result findServiceUnitPage(@ApiParam(value = "业务类型") @RequestParam(required = false) ProductTypeEnum type,
+                                      @ApiParam(value = "负责人") @RequestParam(required = false) String serviceLeadId,
+                                      @ApiParam(value = "服务状态") @RequestParam(required = false) ServiceStatusEnum status,
+                                      @ApiParam(value = "起始时间") @RequestParam(required = false) Long createStartTime,
+                                      @ApiParam(value = "截止时间") @RequestParam(required = false) Long createEndTime,
+                                      @ApiParam(value = "服务单元名称") @RequestParam(required = false) String serviceUnitName,
+                                      @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
+                                      @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
+
+        return ResultUtil.ok(tbServiceService.page(type, SystemConstant.convertIdToLong(serviceLeadId), status, createStartTime, createEndTime, serviceUnitName, pageNumber, pageSize));
+    }
+
 
 }