Commit e82f5938 authored by fangxinjiang's avatar fangxinjiang

Merge branch 'develop'

# Conflicts:
#	yifu-social/yifu-social-biz/src/main/resources/logback-spring.xml
parents 5025a9fb a5a18e13
......@@ -7,7 +7,7 @@ spec: # 资源规范字段
selector: # 选择器
matchLabels: # 匹配标签
app: yifu-archives
replicas: 1 # 声明副本数目
replicas: 2 # 声明副本数目
#revisionHistoryLimit: 3 # 保留历史版本
#strategy: # 策略
# rollingUpdate: # 滚动更新
......
......@@ -24,7 +24,10 @@ import java.io.Serializable;
*/
@Data
public class UpProjectSocialFundVo implements Serializable {
// 社保状态 社保状态(字典): 0 无社保 1 处理中 2.部分购买 3.正常 4.已派减
/**
* @Author fxj
* @Description 社保状态 社保状态(字典): 0 无社保 1 处理中 2.部分购买 3.正常 4.已派减
**/
@Schema(name = "社保状态(字典): 0 无社保 1 处理中 2.部分购买 3.正常 4.已派减")
String socialStatus;
// 公积金状态 社保状态(字典): 0 无社保 1 处理中 2.正常 3.已派减
......
......@@ -17,6 +17,7 @@
package com.yifu.cloud.plus.v1.yifu.archives.controller;
import com.baomidou.lock.annotation.Lock4j;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yifu.cloud.plus.v1.yifu.archives.entity.TEmpFamily;
......@@ -26,6 +27,7 @@ import com.yifu.cloud.plus.v1.yifu.common.core.constant.CommonConstants;
import com.yifu.cloud.plus.v1.yifu.common.core.util.Common;
import com.yifu.cloud.plus.v1.yifu.common.core.util.ErrorMessage;
import com.yifu.cloud.plus.v1.yifu.common.core.util.R;
import com.yifu.cloud.plus.v1.yifu.common.core.util.RedisUtil;
import com.yifu.cloud.plus.v1.yifu.common.dapr.config.DaprCheckProperties;
import com.yifu.cloud.plus.v1.yifu.common.dapr.util.ArchivesDaprUtil;
import com.yifu.cloud.plus.v1.yifu.common.log.annotation.SysLog;
......@@ -60,6 +62,7 @@ public class TEmpFamilyController {
private final TEmpFamilyService tEmpFamilyService;
@Autowired
private final ArchivesDaprUtil archivesDaprUtil;
int i = 0;
/**
* 分页查询
* @param page 分页对象
......@@ -173,4 +176,21 @@ public class TEmpFamilyController {
public R<List<ErrorMessage>> importListAdd(@RequestBody MultipartFile file){
return tEmpFamilyService.importEmpFamilyDiy(file.getInputStream());
}
@Autowired
private RedisUtil redisUtil;
@Lock4j(keys = {"#tEmpFamily.mId"}, expire = 60000, acquireTimeout = 1000)
@Operation(description = "lockTest")
@GetMapping("/lockTest" )
public R<String> lockTest(Page page, FamilySearchVO tEmpFamily) {
Object obj = redisUtil.get("lockTest");
int lockValue;
if (Common.isNotNull(obj)){
lockValue = (int)obj ;
}else {
lockValue = 1;
}
lockValue = lockValue +1;
redisUtil.set("lockTest",lockValue);
return R.ok(CommonConstants.SUCCESS_MSG_PREFIX,String.valueOf(lockValue));
}
}
......@@ -646,6 +646,7 @@ public class TEmployeeProjectServiceImpl extends ServiceImpl<TEmployeeProjectMap
if (!errorMessageList.isEmpty()) {
return R.failed(errorMessageList);
} else {
YifuUser user = SecurityUtils.getUser();
//更新项目档案
if (!updProjectList.isEmpty()) {
baseMapper.updateReduceEmpProject(updProjectList);
......@@ -653,12 +654,11 @@ public class TEmployeeProjectServiceImpl extends ServiceImpl<TEmployeeProjectMap
//更新人员档案
if (!updList.isEmpty()) {
List<TEmployeeInfo> updEmpInfoList = updList.stream().distinct().collect(Collectors.toList());
YifuUser user = SecurityUtils.getUser();
doJointTask.doUpdateEmployeeInfo(updEmpInfoList, user);
}
// 记录变更日志
if (!updateProjectList.isEmpty()) {
doJointTask.saveModificationRecord(updateProjectList);
doJointTask.saveModificationRecord(updateProjectList,user);
}
}
return R.ok();
......
......@@ -132,12 +132,12 @@ public class DoJointTask {
* @return: void
**/
@Async
public void saveModificationRecord(List<EmployeeProjectNewOldVO> updateProjectList) {
public void saveModificationRecord(List<EmployeeProjectNewOldVO> updateProjectList,YifuUser user) {
try {
for (EmployeeProjectNewOldVO newOldVO : updateProjectList) {
tEmployeeLogService.saveModificationRecord(CommonConstants.dingleDigitIntArray[1]
, "", newOldVO.getNewProjectEmployee().getId()
, newOldVO.getOldProjectEmployee(), newOldVO.getNewProjectEmployee());
tEmployeeLogService.saveModificationRecord(CommonConstants.dingleDigitIntArray[1],""
, newOldVO.getNewProjectEmployee().getId(), newOldVO.getOldProjectEmployee(),
newOldVO.getNewProjectEmployee(),user);
}
} catch (Exception e) {
log.error("档案-更新项目档案操作记录错误", e);
......
......@@ -217,7 +217,10 @@
a2.AREA_NAME ID_CITY,
a3.AREA_NAME ID_TOWN,
b.EMP_REGIS_TYPE,
b.IS_COLLEGE,
CASE WHEN b.IS_COLLEGE=0 THEN "否"
WHEN b.IS_COLLEGE =1 THEN "是"
ELSE b.IS_COLLEGE
END as "IS_COLLEGE",
b.HIGN_EDUCATION,
b.SCHOOL,
b.MAJOR,
......
package com.yifu.cloud.plus.v1.check.vo;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.Map;
/**
* @Author hgw
* @Date 2023-2-9 11:18:21
*/
@Getter
@Setter
public class CheckBatchVo implements Serializable {
private Map<String, Boolean> checkMap;
}
......@@ -22,6 +22,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yifu.cloud.plus.v1.check.entity.TCheckBankNo;
import com.yifu.cloud.plus.v1.check.service.TCheckBankNoService;
import com.yifu.cloud.plus.v1.check.vo.CheckBankNoVo;
import com.yifu.cloud.plus.v1.check.vo.CheckBatchVo;
import com.yifu.cloud.plus.v1.yifu.common.core.util.R;
import com.yifu.cloud.plus.v1.yifu.common.log.annotation.SysLog;
import com.yifu.cloud.plus.v1.yifu.common.security.annotation.Inner;
......@@ -31,6 +32,8 @@ import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 银行卡卡号 校验
......@@ -122,6 +125,20 @@ public class TCheckBankNoController {
return tCheckBankNoService.checkBankNoTwo(checkBankNo.getName(),checkBankNo.getBankNo());
}
/**
* @Description: 批量银行卡号校验
* @Author: hgw
* @Date: 2023/2/9 9:57
* @return: com.yifu.cloud.plus.v1.check.vo.CheckBankNoVo
**/
@Operation(description = "批量银行卡号校验")
@SysLog("批量银行卡号校验" )
@Inner
@PostMapping("/inner/checkBankNoBatch" )
public CheckBatchVo checkBankNoBatch(@RequestBody List<TCheckBankNo> list) {
return tCheckBankNoService.checkBankNoBatch(list);
}
/**
* @Description: 代发户调用银行卡校验--如果其他接口也要调用,加上信息
* @Author: hgw
......
......@@ -21,6 +21,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yifu.cloud.plus.v1.check.entity.TCheckMobile;
import com.yifu.cloud.plus.v1.check.service.TCheckMobileService;
import com.yifu.cloud.plus.v1.check.vo.CheckBatchVo;
import com.yifu.cloud.plus.v1.yifu.common.core.constant.CommonConstants;
import com.yifu.cloud.plus.v1.yifu.common.core.util.Common;
import com.yifu.cloud.plus.v1.yifu.common.core.util.R;
......@@ -32,6 +33,7 @@ import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
......@@ -158,4 +160,18 @@ public class TCheckMobileController {
}
}
/**
* @Description: 批量手机号校验
* @Author: hgw
* @Date: 2023-2-9 11:23:10
* @return: com.yifu.cloud.plus.v1.check.vo.CheckBankNoVo
**/
@Operation(description = "批量手机号校验")
@SysLog("批量手机号校验" )
@Inner
@PostMapping("/inner/checkMobileBatch" )
public CheckBatchVo checkMobileBatch(@RequestBody List<String> list) {
return tCheckMobileService.checkMobileBatch(list);
}
}
......@@ -21,6 +21,9 @@ package com.yifu.cloud.plus.v1.check.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yifu.cloud.plus.v1.check.entity.TCheckBankNo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 银行卡卡号 校验
......@@ -31,4 +34,6 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface TCheckBankNoMapper extends BaseMapper<TCheckBankNo> {
List<TCheckBankNo> getListByNoList(@Param("noList") List<String> noList);
}
......@@ -20,6 +20,9 @@ package com.yifu.cloud.plus.v1.check.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yifu.cloud.plus.v1.check.entity.TCheckMobile;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 手机号码校验
......@@ -30,4 +33,6 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface TCheckMobileMapper extends BaseMapper<TCheckMobile> {
List<TCheckMobile> getListByNoList(@Param("noList") List<String> noList);
}
......@@ -20,8 +20,11 @@ package com.yifu.cloud.plus.v1.check.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yifu.cloud.plus.v1.check.entity.TCheckBankNo;
import com.yifu.cloud.plus.v1.check.vo.CheckBankNoVo;
import com.yifu.cloud.plus.v1.check.vo.CheckBatchVo;
import com.yifu.cloud.plus.v1.yifu.common.core.util.R;
import java.util.List;
/**
* 银行卡卡号 校验
*
......@@ -39,4 +42,14 @@ public interface TCheckBankNoService extends IService<TCheckBankNo> {
R<TCheckBankNo> checkBankNo(String name, String cardNo);
CheckBankNoVo checkBankNoTwo(String name, String cardNo);
/**
* @param list
* @Description:批量校验卡号
* @Author: hgw
* @Date: 2023/2/9 11:19
* @return: com.yifu.cloud.plus.v1.check.vo.CheckBatchVo
**/
CheckBatchVo checkBankNoBatch(List<TCheckBankNo> list);
}
......@@ -19,8 +19,10 @@ package com.yifu.cloud.plus.v1.check.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yifu.cloud.plus.v1.check.entity.TCheckMobile;
import com.yifu.cloud.plus.v1.check.vo.CheckBatchVo;
import com.yifu.cloud.plus.v1.yifu.common.core.util.R;
import java.util.List;
import java.util.Map;
/**
......@@ -34,4 +36,12 @@ public interface TCheckMobileService extends IService<TCheckMobile> {
R<Map<String,TCheckMobile>> checkMobiles(String mobiles);
TCheckMobile checkOneMobile(String mobile);
/**
* @Description: 批量手机号
* @Author: hgw
* @Date: 2023/2/9 11:24
* @return: com.yifu.cloud.plus.v1.check.vo.CheckBatchVo
**/
CheckBatchVo checkMobileBatch(List<String> list);
}
......@@ -24,6 +24,7 @@ import com.yifu.cloud.plus.v1.check.service.TCanCheckService;
import com.yifu.cloud.plus.v1.check.service.TCheckBankNoService;
import com.yifu.cloud.plus.v1.check.utils.ChecksUtil;
import com.yifu.cloud.plus.v1.check.vo.CheckBankNoVo;
import com.yifu.cloud.plus.v1.check.vo.CheckBatchVo;
import com.yifu.cloud.plus.v1.yifu.common.core.constant.CommonConstants;
import com.yifu.cloud.plus.v1.yifu.common.core.exception.ErrorCodes;
import com.yifu.cloud.plus.v1.yifu.common.core.util.Common;
......@@ -32,6 +33,11 @@ import com.yifu.cloud.plus.v1.yifu.common.core.util.R;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 银行卡卡号 校验
*
......@@ -90,4 +96,65 @@ public class TCheckBankNoServiceImpl extends ServiceImpl<TCheckBankNoMapper, TCh
return vo;
}
}
@Override
public CheckBatchVo checkBankNoBatch(List<TCheckBankNo> list) {
CheckBatchVo vo = new CheckBatchVo();
List<String> noList = new ArrayList<>();
for (TCheckBankNo no : list) {
if (Common.isNotNull(no.getBankNo())) {
noList.add(no.getBankNo());
}
}
Map<String, TCheckBankNo> noMap = new HashMap<>();
if (!noList.isEmpty()) {
List<TCheckBankNo> checkBankNoList = baseMapper.getListByNoList(noList);
if (checkBankNoList != null && !checkBankNoList.isEmpty()) {
for (TCheckBankNo no : checkBankNoList) {
noMap.put(no.getBankNo(), no);
}
}
}
List<TCheckBankNo> noCurlist = new ArrayList<>();
TCheckBankNo cur;
Map<String, Boolean> bankMap = new HashMap<>();
for (TCheckBankNo check : list) {
cur = noMap.get(check.getBankNo());
if (cur != null) {
if (CommonConstants.ZERO_ONE.equals(cur.getResult())) {
bankMap.put(cur.getBankNo(), cur.getName().equals(check.getName()));
} else {
if (cur.getName().equals(check.getName())) {
bankMap.put(cur.getBankNo(), false);
} else {
noCurlist.add(check);
}
}
} else {
noCurlist.add(check);
}
}
List<TCheckBankNo> saveList = new ArrayList<>();
if (!noCurlist.isEmpty()) {
synchronized (this) {
TCheckBankNo newNo;
R<TCheckBankNo> resR;
boolean canCheck = canCheckService.getCanCheck();
for (TCheckBankNo no : noCurlist) {
resR = ChecksUtil.checkBankNoTwo(no.getName(), no.getBankNo(), canCheck);
if (Common.isNotNull(resR) && Common.isNotNull(resR.getData())) {
newNo = resR.getData();
bankMap.put(newNo.getBankNo(), CommonConstants.ZERO_ONE.equals(newNo.getResult()));
saveList.add(newNo);
}
}
if (!saveList.isEmpty()) {
this.saveBatch(saveList);
}
}
}
vo.setCheckMap(bankMap);
return vo;
}
}
......@@ -23,6 +23,7 @@ import com.yifu.cloud.plus.v1.check.mapper.TCheckMobileMapper;
import com.yifu.cloud.plus.v1.check.service.TCanCheckService;
import com.yifu.cloud.plus.v1.check.service.TCheckMobileService;
import com.yifu.cloud.plus.v1.check.utils.ChecksUtil;
import com.yifu.cloud.plus.v1.check.vo.CheckBatchVo;
import com.yifu.cloud.plus.v1.yifu.common.core.constant.CommonConstants;
import com.yifu.cloud.plus.v1.yifu.common.core.exception.ErrorCodes;
import com.yifu.cloud.plus.v1.yifu.common.core.util.Common;
......@@ -31,6 +32,7 @@ import com.yifu.cloud.plus.v1.yifu.common.core.util.R;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
......@@ -161,4 +163,60 @@ public class TCheckMobileServiceImpl extends ServiceImpl<TCheckMobileMapper, TCh
return returnMobile;
}
@Override
public CheckBatchVo checkMobileBatch(List<String> list) {
CheckBatchVo vo = new CheckBatchVo();
Map<String, Boolean> noMap = new HashMap<>();
if (!list.isEmpty()) {
List<TCheckMobile> checkMobileList = baseMapper.getListByNoList(list);
if (checkMobileList != null && !checkMobileList.isEmpty()) {
for (TCheckMobile no : checkMobileList) {
noMap.put(no.getMobile(), CommonConstants.ONE_STRING.equals(no.getStatus())
|| CommonConstants.FOUR_STRING.equals(no.getStatus())
|| CommonConstants.FIVE_STRING.equals(no.getStatus()));
}
}
}
List<String> noCurlist = new ArrayList<>();
Boolean cur;
Map<String, Boolean> backMap = new HashMap<>();
StringBuilder phones = new StringBuilder();
for (String check : list) {
cur = noMap.get(check);
if (cur != null) {
backMap.put(check, cur);
} else {
phones.append(check).append(CommonConstants.COMMA_STRING);
noCurlist.add(check);
}
}
if (phones.length() > 0) {
phones.deleteCharAt(phones.length()-1);
}
List<TCheckMobile> saveList = new ArrayList<>();
if (!noCurlist.isEmpty() && Common.isNotNull(phones)) {
synchronized (this) {
R<Map<String, TCheckMobile>> mobileMapR = ChecksUtil.checkMobile(phones.toString(), canCheckService.getCanCheck());
if (Common.isNotNull(mobileMapR) && Common.isNotNull(mobileMapR.getData())) {
Map<String, TCheckMobile> result = mobileMapR.getData();
TCheckMobile mo;
for (String no : noCurlist) {
mo = result.get(no);
backMap.put(no, mo == null || (CommonConstants.ONE_STRING.equals(mo.getStatus())
|| CommonConstants.FOUR_STRING.equals(mo.getStatus())
|| CommonConstants.FIVE_STRING.equals(mo.getStatus())));
if (mo != null) {
saveList.add(mo);
}
}
}
if (!saveList.isEmpty()) {
this.saveBatch(saveList);
}
}
}
vo.setCheckMap(backMap);
return vo;
}
}
......@@ -41,4 +41,18 @@
<result property="name" column="name"/>
<result property="idNum" column="id_num"/>
</resultMap>
<!--获取list-->
<select id="getListByNoList" resultMap="tCheckBankNoMap">
SELECT
a.id,
a.bank_no,
a.name,
a.result
FROM t_check_bank_no a
where a.bank_no in
<foreach item="item" index="index" collection="noList" open="(" separator="," close=")">
#{item}
</foreach>
</select>
</mapper>
......@@ -38,4 +38,17 @@
<result property="status" column="status"/>
<result property="message" column="message"/>
</resultMap>
<!--获取list-->
<select id="getListByNoList" resultMap="tCheckMobileMap">
SELECT
a.id,
a.mobile,
a.status
FROM t_check_mobile a
where a.mobile in
<foreach item="item" index="index" collection="noList" open="(" separator="," close=")">
#{item}
</foreach>
</select>
</mapper>
......@@ -110,5 +110,10 @@
<version>4.5.30</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>lock4j-redis-template-spring-boot-starter</artifactId>
<version>2.2.4</version>
</dependency>
</dependencies>
</project>
package com.yifu.cloud.plus.v1.yifu.common.core.config;
import ch.qos.logback.core.util.ExecutorServiceUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Configuration;
......
......@@ -133,6 +133,9 @@ public interface CommonConstants {
String FIVE_STRING = "5";
String TWELVE_STRING = "12";
String ELEVEN_STRING = "11";
int TWELVE_INT = 12;
String THIRTEEN_STRING = "13";
......
......@@ -521,11 +521,17 @@ public interface ErrorCodes {
* 派增异常: 失败项重新派单缴纳方式不可变更
*/
String EMP_DISPATCH_SOCIAL_PAYMENT_TYPE_NOT_SAME = "emp.dispatch.social.payment.type.same";
/**
* 社保户不能为空
**/
String SOCIAL_HOLD_IS_EMPTY = "social.hold.is.empty";
/**
* 公积金户不能为空
**/
String FUND_HOLD_IS_EMPTY = "fund.hold.is.empty";
/**
* 信息校验通过,但其他行存在问题数据,请调整后,统一减档
**/
String ARCHIVES_IMPORT_EMP_TRUE = "archives.import.emp.true";
/**
......
package com.yifu.cloud.plus.v1.yifu.common.core.redis.lock4j;
import com.baomidou.lock.LockFailureStrategy;
import com.baomidou.lock.exception.LockFailureException;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
/**
* @Author fxj
* @Date 2023/2/7
* @Description lock4j 分布式锁 异常 自定义异常策略
* @Version 1.0
*/
@Component
public class MyLockFailureStrategy implements LockFailureStrategy {
@Override
public void onLockFailure(String key, Method method, Object[] arguments) {
throw new LockFailureException("业务执行中,请稍后重试");
}
}
......@@ -143,7 +143,7 @@ public class ExcelUtil <T> implements Serializable {
}
field.set(vo, Common.isNotNull(value)?value:field.get(vo));
}catch (Exception e){
log.error("字典数据解析异常");
log.error("字典数据解析异常",e);
}
}
}
......@@ -1112,7 +1112,7 @@ public class ExcelUtil <T> implements Serializable {
}
field.set(vo, Common.isNotNull(value)?value:field.get(vo));
}catch (Exception e){
log.error("字典数据解析异常");
log.error("字典数据解析异常",e);
}
}
}
......
......@@ -51,15 +51,52 @@ public class HrEquator extends GetterBaseEquator {
List<FieldInfo> diff = equator.getDiffFields(oldInfo, newInfo);
Map<String, Integer> curMap = new HashMap<>();
String fieldName;
String fieldName2;
boolean newChange = false;
if (!Common.isEmpty(diff)) {
List<FieldInfo> diff2;
for(FieldInfo field:diff){
fieldName = field.getFieldName();
curMap.put(fieldName, 1);
if (!"updateTime".equals(fieldName) && !"updateBy".equals(fieldName)) {
if (!"updateTime".equals(fieldName) && !"updateBy".equals(fieldName) && !"java.util.List".equals(field.getFirstFieldType().getName())) {
newChange = true;
sb.append(field.getFieldName()).append(",");
}
try {
if ("java.util.List".equals(field.getFirstFieldType().getName())) {
List<Object> firstList = (List<Object>) field.getFirstVal();
List<Object> secondList = (List<Object>) field.getSecondVal();
curMap.put(fieldName, 1);
if (firstList != null && secondList != null && !firstList.isEmpty()) {
if (firstList.size() == secondList.size()) {
boolean isTrue = true;
for (int i = 0; i < firstList.size(); i++) {
if (isTrue) {
diff2 = equator.getDiffFields(firstList.get(i), secondList.get(i));
for (FieldInfo field2 : diff2) {
fieldName2 = field2.getFieldName();
if (!"createTime".equals(fieldName2) && !"createBy".equals(fieldName2) && !"createName".equals(fieldName2)
&& !"updateTime".equals(fieldName2) && !"updateBy".equals(fieldName2)) {
newChange = true;
sb.append(field.getFieldName()).append(",");
isTrue = false;
break;
}
}
}
}
} else {
newChange = true;
sb.append(field.getFieldName()).append(",");
}
} else if ((firstList != null && !firstList.isEmpty()) || (secondList != null && !secondList.isEmpty())) {
newChange = true;
sb.append(field.getFieldName()).append(",");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
// 从有值变为空,也要记录变更日志
......
......@@ -50,6 +50,8 @@ public class ErrorDetailVO implements Serializable {
// 提示信息
private String message;
// 颜色
private String color = "red";
// 所有行的结果,当第一行的allTrue=1时,需要反馈文件,否则直接提示成功
private int allTrue = 0;
......@@ -70,4 +72,15 @@ public class ErrorDetailVO implements Serializable {
this.message = message;
}
public ErrorDetailVO(Integer lineNum, int result, String empIdCard, String socialHousehold, String providentHousehold, String empName,String message,String color) {
this.lineNum = lineNum;
this.result = result;
this.empIdCard = empIdCard;
this.socialHousehold = socialHousehold;
this.providentHousehold = providentHousehold;
this.empName = empName;
this.message = message;
this.color = color;
}
}
......@@ -6,4 +6,5 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.yifu.cloud.plus.v1.yifu.common.core.util.SpringContextHolder,\
com.yifu.cloud.plus.v1.yifu.common.core.config.WebMvcConfiguration,\
com.yifu.cloud.plus.v1.yifu.common.core.util.OSSUtil,\
com.yifu.cloud.plus.v1.yifu.common.core.util.RedisUtil
com.yifu.cloud.plus.v1.yifu.common.core.util.RedisUtil,\
com.yifu.cloud.plus.v1.yifu.common.core.redis.lock4j.MyLockFailureStrategy
package com.yifu.cloud.plus.v1.yifu.common.security.exception;
import com.baomidou.lock.exception.LockFailureException;
import com.fasterxml.jackson.databind.exc.InvalidFormatException;
import com.yifu.cloud.plus.v1.yifu.common.core.exception.ValidateCodeException;
import com.yifu.cloud.plus.v1.yifu.common.core.util.Common;
......@@ -152,4 +153,17 @@ public class GlobalExceptionHandler {
log.error("全局异常信息 触发用户:获取失败 ex={}", exception.getMessage(), exception);
}
}
/**
* 获取锁异常 lockException
*
* @param e
* @return R
*/
@ExceptionHandler({LockFailureException.class})
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public R lockFailExceptionHandler(Exception e) {
errorLog(e);
R result = R.failed("业务处理锁异常:"+ e.getMessage());
return result;
}
}
......@@ -78,4 +78,10 @@ public class InsuranceHandleImportParam implements Serializable {
*/
@Schema(description = "错误信息")
private String errorMessage;
/**
* 错误标志 0 正确 1错误
*/
@Schema(description = "错误标志")
private String flag;
}
......@@ -94,6 +94,12 @@ public class InsuranceInsuredParam implements Serializable {
@Schema(description = "错误信息")
private String errorMessage;
/**
* 错误标志 0 正确 1错误
*/
@Schema(description = "错误标志")
private String flag;
/**
* 数据传递对象
*/
......
......@@ -64,6 +64,11 @@ public class InsuranceRegisterInvoiceNoParam implements Serializable {
@Schema(description = "发票号")
private String invoiceNo;
/**
* 错误标志 0 正确 1错误
*/
@Schema(description = "错误标志")
private String flag;
/**
* 错误信息
......
......@@ -83,6 +83,12 @@ public class InsuranceRegisterParam implements Serializable {
@Schema(description = "错误信息")
private String errorMessage;
/**
* 错误标志 0 正确 1错误
*/
@Schema(description = "错误标志")
private String flag;
/**
* 数据传递对象
*/
......
......@@ -8,7 +8,7 @@ ARG JAR_FILE=target/yifu-insurances-biz.jar
COPY ${JAR_FILE} app.jar
EXPOSE 5002
EXPOSE 5005
ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms128m -Xmx256m -Djava.security.egd=file:/dev/./urandom"
......
......@@ -3387,6 +3387,7 @@ public class TInsuranceDetailServiceImpl extends ServiceImpl<TInsuranceDetailMap
outer:
for (int i = 0; i < distinctList.size(); i++) {
InsuranceRegisterParam param = distinctList.get(i);
param.setFlag(CommonConstants.ONE_STRING);
// 必填校验
if (StringUtils.isBlank(param.getEmpName())){
param.setErrorMessage(InsurancesConstants.EMP_NAME_NOT_EMPTY);
......@@ -3635,6 +3636,7 @@ public class TInsuranceDetailServiceImpl extends ServiceImpl<TInsuranceDetailMap
}
}
param.setErrorMessage(CommonConstants.RESULT_DATA_SUCESS);
param.setFlag(CommonConstants.ZERO_STRING);
//所有校验通过后设置查到的结果
param.setDetail(detail);
}
......@@ -3652,6 +3654,7 @@ public class TInsuranceDetailServiceImpl extends ServiceImpl<TInsuranceDetailMap
private List<InsuranceRegisterInvoiceNoParam> registeredInvoiceNoCheck(List<InsuranceRegisterInvoiceNoParam> paramList, List<TInsuranceAreaRes> insuranceAreaResList){
List<InsuranceRegisterInvoiceNoParam> collect = paramList.stream().distinct().collect(Collectors.toList());
for (InsuranceRegisterInvoiceNoParam param : collect) {
param.setFlag(CommonConstants.ONE_STRING);
// 必填校验
if (StringUtils.isBlank(param.getEmpName())){
param.setErrorMessage(InsurancesConstants.EMP_NAME_NOT_EMPTY);
......@@ -3730,6 +3733,7 @@ public class TInsuranceDetailServiceImpl extends ServiceImpl<TInsuranceDetailMap
}
}
param.setErrorMessage(CommonConstants.RESULT_DATA_SUCESS);
param.setFlag(CommonConstants.ZERO_STRING);
//所有校验通过后设置查到的结果
param.setDetail(detail);
}
......@@ -3749,6 +3753,7 @@ public class TInsuranceDetailServiceImpl extends ServiceImpl<TInsuranceDetailMap
private List<InsuranceInsuredParam> updateInsuranceInsuredCheck(List<InsuranceInsuredParam> paramList, List<TInsuranceAreaRes> insuranceAreaResList){
List<InsuranceInsuredParam> collect = paramList.stream().distinct().collect(Collectors.toList());
for (InsuranceInsuredParam param : collect) {
param.setFlag(CommonConstants.ONE_STRING);
// 必填校验
if (StringUtils.isBlank(param.getEmpName())){
param.setErrorMessage(InsurancesConstants.EMP_NAME_NOT_EMPTY);
......@@ -3869,6 +3874,7 @@ public class TInsuranceDetailServiceImpl extends ServiceImpl<TInsuranceDetailMap
}
}
param.setErrorMessage(CommonConstants.RESULT_DATA_SUCESS);
param.setFlag(CommonConstants.ZERO_STRING);
//所有校验通过后设置查到的结果
param.setDetail(detail);
}
......@@ -6124,6 +6130,7 @@ public class TInsuranceDetailServiceImpl extends ServiceImpl<TInsuranceDetailMap
for (int i = 0; i < distinctList.size(); i++) {
InsuranceHandleImportParam param = distinctList.get(i);
//办理结果
param.setFlag(CommonConstants.ONE_STRING);
String handType = param.getHandType();
if(StringUtils.isBlank(handType)){
param.setErrorMessage(InsurancesConstants.HAND_RESULT_IS_EMPTY);
......@@ -6289,6 +6296,7 @@ public class TInsuranceDetailServiceImpl extends ServiceImpl<TInsuranceDetailMap
}
param.setId(detailId);
param.setErrorMessage(CommonConstants.RESULT_DATA_SUCESS);
param.setFlag(CommonConstants.ZERO_STRING);
}
return distinctList;
}
......
......@@ -8,7 +8,7 @@ ARG JAR_FILE=target/yifu-order-biz.jar
COPY ${JAR_FILE} app.jar
EXPOSE 5002
EXPOSE 5006
ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms128m -Xmx256m -Djava.security.egd=file:/dev/./urandom"
......
......@@ -541,6 +541,12 @@ public class TSalaryAccount extends BaseEntity {
@Schema(description = "支出信息付款状态")
private String payCollectFlag;
/**
* 是否差额单 默认0否; 1是
*/
@Schema(description = "是否差额单")
private String isDiff;
/**
* 工资月份-起
*/
......
......@@ -21,6 +21,7 @@ import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.HeadFontStyle;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.yifu.cloud.plus.v1.yifu.common.core.constant.ExcelAttribute;
......@@ -200,4 +201,8 @@ public class TSalaryEmployee extends BaseEntity {
@Schema(description ="代发户状态(0正常;1代发户进的数据,下次要验证银行卡)")
private Integer issueStatus;
// 导工资需要的标志:行号
@TableField(exist = false)
private Integer lineNums;
}
......@@ -439,6 +439,12 @@ public class TSalaryStandard extends BaseEntity {
@Schema(description ="代发户状态(0正常;1代发户)")
private Integer issueStatus;
/**
* 是否差额单 默认0否; 1是
*/
@Schema(description = "是否差额单")
private String isDiff;
/**
* 工资月份-起
*/
......
package com.yifu.cloud.plus.v1.yifu.salary.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.HeadFontStyle;
import com.yifu.cloud.plus.v1.yifu.common.core.constant.ExcelAttribute;
import lombok.Getter;
import lombok.Setter;
import java.math.BigDecimal;
/**
* @author hgw2
* @description 差额单Vo
* @date 2023/2/2
*/
@Getter
@Setter
public class AccountByEkpDiffVo {
// 报账表id
private String accountId;
// 应发薪酬(劳务费、稿酬)
private BigDecimal relaySalary;
// 实发(个人实收)
private BigDecimal actualSalary;
// 个税金额(个人承担)
private BigDecimal salaryTax;
}
......@@ -8,7 +8,7 @@ ARG JAR_FILE=target/yifu-salary-biz.jar
COPY ${JAR_FILE} app.jar
EXPOSE 5002
EXPOSE 5003
ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms128m -Xmx256m -Djava.security.egd=file:/dev/./urandom"
......
......@@ -26,9 +26,11 @@ import com.yifu.cloud.plus.v1.yifu.common.core.vo.YifuUser;
import com.yifu.cloud.plus.v1.yifu.common.dapr.util.MenuUtil;
import com.yifu.cloud.plus.v1.yifu.common.log.annotation.SysLog;
import com.yifu.cloud.plus.v1.yifu.common.security.util.SecurityUtils;
import com.yifu.cloud.plus.v1.yifu.salary.entity.TSalaryAccount;
import com.yifu.cloud.plus.v1.yifu.salary.entity.TSalaryStandard;
import com.yifu.cloud.plus.v1.yifu.salary.service.TSalaryStandardService;
import com.yifu.cloud.plus.v1.yifu.salary.util.SalaryConstants;
import com.yifu.cloud.plus.v1.yifu.salary.vo.AccountByEkpDiffVo;
import com.yifu.cloud.plus.v1.yifu.salary.vo.TSalaryStandardSearchVo;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
......@@ -38,6 +40,7 @@ import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.List;
/**
......@@ -247,5 +250,18 @@ public class TSalaryStandardController {
public String testSendEkpList(@RequestParam String id) {
return tSalaryStandardService.testSendEkpList(id);
}
/**
* @Description: 差额单--EKP调用接口
* @Author: hgw
* @Date: 2023/1/31 17:28
* @return: com.yifu.cloud.plus.v1.yifu.common.core.util.R<java.lang.String>
**/
@Operation(summary = "差额单--EKP调用接口", description = "差额单--EKP调用接口")
@SysLog("差额单--EKP调用接口")
@PostMapping("/saveSalaryDiff")
public R<String> saveSalaryDiff(@RequestBody List<AccountByEkpDiffVo> voList) {
return tSalaryStandardService.saveSalaryDiff(voList);
}
}
......@@ -168,4 +168,6 @@ public interface TSalaryAccountItemMapper extends BaseMapper<TSalaryAccountItem>
*/
IPage<TSalaryAccountItem> getTSalaryAccountItemPage(Page<TSalaryAccountItem> page, @Param("tSalaryAccountItem") TSalaryAccountItem tSalaryAccountItem);
List<TSalaryAccountItem> getListByAccIdList(@Param("accIdList") List<String> accIdList);
}
......@@ -78,6 +78,7 @@ public interface TSalaryAccountMapper extends BaseMapper<TSalaryAccount> {
* @return: java.lang.String
**/
String getMinTaxMonthByNowYear(@Param("empIdCard") String empIdCard, @Param("nowYear") int nowYear);
List<TSalaryAccount> getMinTaxMonthByNowYearAndList(@Param("empIdCardList") List<String> empIdCardList, @Param("nowYear") int nowYear);
/**
* @return
......@@ -163,4 +164,13 @@ public interface TSalaryAccountMapper extends BaseMapper<TSalaryAccount> {
**/
IPage<SalaryAccountAndItemVo> getSalaryAccountAndItemVoPage(Page<SalaryAccountAndItemVo> page
, @Param("salaryAccountAndItemVo") SalaryAccountAndItemVo salaryAccountAndItemVo);
/**
* @param idList
* @Description: 根据idList获取报账信息
* @Author: hgw
* @Date: 2023/2/2 17:16
* @return: java.util.List<com.yifu.cloud.plus.v1.yifu.salary.entity.TSalaryAccount>
**/
List<TSalaryAccount> getListByIdList(@Param("idList") List<String> idList);
}
......@@ -119,4 +119,13 @@ public interface TSalaryAccountItemService extends IService<TSalaryAccountItem>
**/
Set<String> getItemSet(String salaryId);
/**
* @param accIdList
* @Description: 获取list
* @Author: hgw
* @Date: 2023/2/3 15:46
* @return: java.util.List<com.yifu.cloud.plus.v1.yifu.salary.entity.TSalaryAccountItem>
**/
List<TSalaryAccountItem> getListByAccIdList(List<String> accIdList);
}
\ No newline at end of file
......@@ -92,6 +92,16 @@ public interface TSalaryAccountService extends IService<TSalaryAccount> {
**/
String getMinTaxMonthByNowYear(String empIdCard, int nowYear);
/**
* @param empIdCardList
* @param nowYear
* @Description: 获取最小计税月的map
* @Author: hgw
* @Date: 2023/2/8 17:19
* @return: java.util.Map<java.lang.String, java.lang.String>
**/
Map<String, String> getMinTaxMonthByNowYearAndList(List<String> empIdCardList, int nowYear);
/**
* @Author fxj
* @Description 获取有工资无社保数据 3个月的工资
......@@ -166,4 +176,13 @@ public interface TSalaryAccountService extends IService<TSalaryAccount> {
**/
IPage<SalaryAccountAndItemVo> getSalaryAccountAndItemVoPage(Page<SalaryAccountAndItemVo> page
, SalaryAccountAndItemVo salaryAccountAndItemVo);
/**
* @Description: 根据idList获取报账信息
* @Author: hgw
* @Date: 2023/2/2 17:42
* @return: java.util.List<com.yifu.cloud.plus.v1.yifu.salary.entity.TSalaryAccount>
**/
List<TSalaryAccount> getListByIdList(List<String> idList);
}
......@@ -30,6 +30,7 @@ import com.yifu.cloud.plus.v1.yifu.salary.vo.TSalaryEmployeeSearchVo;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
/**
* 薪酬人员表
......@@ -61,6 +62,16 @@ public interface TSalaryEmployeeService extends IService<TSalaryEmployee> {
**/
String saveNewSalaryEmployee(boolean notLabour, TSalaryEmployee employee);
/**
* @param saveNewEmpList
* @param errorList
* @Description: 批量新增人员,包含批量判断,减少判断时间等
* @Author: hgw
* @Date: 2023/2/9 14:57
* @return: java.lang.String
**/
String saveNewEmployeeList(List<TSalaryEmployee> saveNewEmpList, List<ErrorMessage> errorList);
/**
* @param inputStream
* @Description: 批量更新-薪资人员信息
......@@ -81,6 +92,15 @@ public interface TSalaryEmployeeService extends IService<TSalaryEmployee> {
TSalaryEmployee getByEmpIdCard(String empIdCard);
/**
* @param idCardList
* @Description: 批量获取员工
* @Author: hgw
* @Date: 2023/2/8 14:29
* @return: java.util.Map<java.lang.String, com.yifu.cloud.plus.v1.yifu.salary.entity.TSalaryEmployee>
**/
Map<String, TSalaryEmployee> getByEmpIdCardList(List<String> idCardList);
/**
* @param employee
* @Description: 代发户的,下次校验银行卡,同时变更校验flag
......@@ -90,4 +110,6 @@ public interface TSalaryEmployeeService extends IService<TSalaryEmployee> {
**/
boolean checkBankInfo(TSalaryEmployee employee);
boolean checkBankInfoList(List<TSalaryEmployee> empList, List<ErrorMessage> errorList);
}
......@@ -22,7 +22,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yifu.cloud.plus.v1.yifu.common.core.util.R;
import com.yifu.cloud.plus.v1.yifu.common.core.vo.YifuUser;
import com.yifu.cloud.plus.v1.yifu.salary.entity.TSalaryAccount;
import com.yifu.cloud.plus.v1.yifu.salary.entity.TSalaryStandard;
import com.yifu.cloud.plus.v1.yifu.salary.vo.AccountByEkpDiffVo;
import com.yifu.cloud.plus.v1.yifu.salary.vo.TSalaryStandardExportVo;
import com.yifu.cloud.plus.v1.yifu.salary.vo.TSalaryStandardSearchVo;
......@@ -115,4 +117,12 @@ public interface TSalaryStandardService extends IService<TSalaryStandard> {
String testSendEkpList(String id);
/**
* @Description: 差额单--EKP调用接口
* @Author: hgw
* @Date: 2023/1/31 17:29
* @return: com.yifu.cloud.plus.v1.yifu.common.core.util.R<java.lang.String>
**/
R<String> saveSalaryDiff(List<AccountByEkpDiffVo> voList);
}
......@@ -224,7 +224,7 @@ public class SalaryUploadServiceImpl extends ServiceImpl<TSalaryStandardMapper,
// return R.ok(saList)
//薪资导入
if (CommonConstants.ZERO_STRING.equals(salaryType)) {
return this.saveAndSubmit(saList, vo);
return this.saveAndSubmit(saList, vo, dept);
}
//劳务费和稿酬导入
if (CommonConstants.THREE_STRING.equals(salaryType) || CommonConstants.FOUR_STRING.equals(salaryType)) {
......@@ -243,25 +243,6 @@ public class SalaryUploadServiceImpl extends ServiceImpl<TSalaryStandardMapper,
return R.failed("导入数据不可为空");
}
/**
* @param strList list
* @Description: 返回idStr
* @Author: hgw
* @Date: 2019/10/17 14:50
* @return: java.lang.String
**/
public static String salaryEstimateListToStr(List<MSalaryEstimate> strList) {
StringBuilder result = new StringBuilder();
for (int i = 0; i < strList.size(); i++) {
if (i == 0) {
result.append("'").append(strList.get(0).getEstimateId()).append("'");
} else {
result.append(",'").append(strList.get(i).getEstimateId()).append("'");
}
}
return result.toString();
}
/**
* @param sav 报账表vo
* @param dept 结算主体
......@@ -322,7 +303,7 @@ public class SalaryUploadServiceImpl extends ServiceImpl<TSalaryStandardMapper,
* @Date: 2019/9/20 17:05
* @return: com.yifu.cloud.v1.common.core.util.R
**/
private R saveAndSubmit(List<TSalaryAccountVo> savList, SalaryUploadParamVo vo) {
private R saveAndSubmit(List<TSalaryAccountVo> savList, SalaryUploadParamVo vo, TSettleDomainSelectVo dept) {
if (Common.isNotNull(savList) && !savList.isEmpty()) {
String orderId = vo.getOrderId();
// 代发户
......@@ -331,16 +312,6 @@ public class SalaryUploadServiceImpl extends ServiceImpl<TSalaryStandardMapper,
List<TSalaryStandardIssueRes> resList = vo.getResList();
TSalaryAccountVo salaryAccountVo = savList.get(0);
List<TSalaryAccountItem> saiList = null; //报账明细List
R<TSettleDomainSelectVo> sdr = HttpDaprUtil.invokeMethodPost(archivesProperties.getAppUrl(), archivesProperties.getAppId()
, "/tsettledomain/inner/getSettleDomainVoById", salaryAccountVo.getDeptId(), TSettleDomainSelectVo.class, SecurityConstants.FROM_IN);
//结算主体
TSettleDomainSelectVo dept = null;
if (sdr != null && sdr.getData() != null) {
dept = sdr.getData();
}
if (dept == null || dept.getId() == null) {
return R.failed("新建工资主表失败-获取结算主体信息为空");
}
String invoiceTitle = dept.getBusinessSubjectName();
if (Common.isEmpty(invoiceTitle)) {
return R.failed("新建工资主表失败-获取结算主体的-封面抬头-信息为空,请去<EKP系统-项目>模块,编辑封面抬头后再导入");
......@@ -502,7 +473,6 @@ public class SalaryUploadServiceImpl extends ServiceImpl<TSalaryStandardMapper,
boolean modelPersonFundFlag;
boolean modelUnitSocialFlag;
boolean modelUnitFundFlag;
BigDecimal money; //初始化金额备用
Set<String> socialList = new HashSet<>(); //社保需要存储的id
Set<String> fundList = new HashSet<>(); //公积金需要存储的id
......@@ -557,10 +527,7 @@ public class SalaryUploadServiceImpl extends ServiceImpl<TSalaryStandardMapper,
Map<String, List<TSalaryAccountItem>> itemMap = tSalaryAccountItemService.getAllItemVoList(idCardList, invoiceTitle);
// 是否劳务费,true:是
boolean isLabor = false;
if ("3".equals(salaryAccountVo.getFormType())) {
isLabor = true;
}
boolean isLabor = CommonConstants.THREE_STRING.equals(salaryAccountVo.getFormType());
TSalaryAccountItem sai;
for (int i = CommonConstants.ZERO_INT; i < size; i++) {
modelPersonSocialFlag = true;
......@@ -930,45 +897,23 @@ public class SalaryUploadServiceImpl extends ServiceImpl<TSalaryStandardMapper,
mSalaryEstimateService.save(se);
}
}
TPauseSalary ps;
int i =1;
for (TSalaryAccount account : aList) {
saiList = account.getSaiList();
account.setSaiList(null);
account.setSalaryFormId(salary.getId());
account.setOrderId(salary.getOrderId());
account.setRowIndex(i);
i++;
tSalaryAccountService.save(account);
money = SalaryConstants.B_ZERO;
}
tSalaryAccountService.saveBatch(aList);
List<TSalaryAccountItem> saveSaiList = new ArrayList<>();
for (TSalaryAccount account : aList) {
saiList = account.getSaiList();
for (TSalaryAccountItem item : saiList) {
if (SalaryConstants.ACTUAL_SALARY_SUM_JAVA.equals(item.getJavaFiedName())) {
money = item.getSalaryMoney();
}
item.setSalaryAccountId(account.getId());
tSalaryAccountItemService.save(item);
}
//暂停发
if (SalaryConstants.SALARY_GIVE_TIME_VALUE.equals(account.getSalaryGiveTime())) {
ps = new TPauseSalary();
ps.setBalance(money);
ps.setName(account.getEmpName());
ps.setIdCard(account.getEmpIdcard());
ps.setBankName(account.getBankName());
ps.setBankNo(account.getBankNo());
ps.setCreateTime(nowTime);
ps.setCreateBy(user.getId());
ps.setSettleDepartId(dept.getId());
ps.setSettleDepartNo(dept.getDepartNo());
ps.setSettleDepartName(dept.getDepartName());
ps.setSalaryFormId(salary.getId());
ps.setSalaryAccountId(account.getId());
ps.setSalaryDate(account.getSalaryMonth());
ps.setSettleDate(account.getSettlementMonth());
ps.setType(SalaryConstants.PAUSE_TYPE[0]);
tPauseSalaryService.save(ps);
}
saveSaiList.addAll(saiList);
}
tSalaryAccountItemService.saveBatch(saveSaiList);
return R.ok(salaryDetailVo);
}
......@@ -1723,6 +1668,7 @@ public class SalaryUploadServiceImpl extends ServiceImpl<TSalaryStandardMapper,
.eq(TSalaryAccount::getEmpIdcard,a.getEmpIdcard())
.eq(TSalaryAccount::getFormType,CommonConstants.THREE_STRING)
.eq(TSalaryAccount::getSalaryMonth,a.getSalaryMonth())
.eq(TSalaryAccount::getInvoiceTitle,a.getInvoiceTitle())
.eq(TSalaryAccount::getDeleteFlag,CommonConstants.ZERO_INT));
// 本次实发
......@@ -1776,12 +1722,16 @@ public class SalaryUploadServiceImpl extends ServiceImpl<TSalaryStandardMapper,
relaySalary = BigDecimalUtils.safeAdd(actualSalarySumNow, nowTaxY).setScale(SalaryConstants.PLACES, RoundingMode.HALF_UP);
} else {
// 2个人承担全部
// TODO-@胡 :个人承担全部税费,实发要变为应发,推算出实发、个税
nowTaxY = BigDecimal.ZERO;
relaySalary = a.getActualSalary();
//个人承担全部税费,实发要变为应发,推算出实发、个税
nowTaxY = getNowTaxNew(BigDecimalUtils.safeAdd(actualSalarySumNow, sumSalaryTax).setScale(SalaryConstants.PLACES, RoundingMode.HALF_UP));
if (sumOtherTax.compareTo(BigDecimal.ZERO) != 0) {
//历史应发税费
nowTaxY = BigDecimalUtils.safeSubtract(false,nowTaxY, sumOtherTax).setScale(SalaryConstants.PLACES, RoundingMode.HALF_UP);
}
//公司应发和个人实收
relaySalary = actualSalarySumNow;
a.setActualSalary(BigDecimalUtils.safeSubtract(false,actualSalarySumNow, nowTaxY).setScale(SalaryConstants.PLACES, RoundingMode.HALF_UP));
a.setSalaryTax(nowTaxY);
}
a.setRelaySalaryUnit(relaySalary);
a.setRelaySalary(actualSalarySumNow);
......
......@@ -204,4 +204,9 @@ public class TSalaryAccountItemServiceImpl extends ServiceImpl<TSalaryAccountIte
public Set<String> getItemSet(String salaryId) {
return baseMapper.getItemSet(salaryId);
}
@Override
public List<TSalaryAccountItem> getListByAccIdList(List<String> accIdList) {
return baseMapper.getListByAccIdList(accIdList);
}
}
......@@ -16,7 +16,6 @@
*/
package com.yifu.cloud.plus.v1.yifu.salary.service.impl;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
......@@ -192,6 +191,20 @@ public class TSalaryAccountServiceImpl extends ServiceImpl<TSalaryAccountMapper,
return baseMapper.getMinTaxMonthByNowYear(empIdCard, nowYear);
}
@Override
public Map<String, String> getMinTaxMonthByNowYearAndList(List<String> empIdCardList, int nowYear) {
Map<String, String> taxMonthMap = new HashMap<>();
if (empIdCardList != null && !empIdCardList.isEmpty()) {
List<TSalaryAccount> list = baseMapper.getMinTaxMonthByNowYearAndList(empIdCardList, nowYear);
if (list != null && !list.isEmpty()) {
for (TSalaryAccount a : list) {
taxMonthMap.put(a.getEmpIdcard(), a.getTaxMonth());
}
}
}
return taxMonthMap;
}
/**
* @Author fxj
* @Description 获取有工资无社保数据
......@@ -288,4 +301,15 @@ public class TSalaryAccountServiceImpl extends ServiceImpl<TSalaryAccountMapper,
return baseMapper.getSalaryAccountAndItemVoPage(page, salaryAccountAndItemVo);
}
/**
* @param idList
* @Description: 根据idList获取报账信息
* @Author: hgw
* @Date: 2023/2/2 17:41
* @return: java.util.List<com.yifu.cloud.plus.v1.yifu.salary.entity.TSalaryAccount>
**/
@Override
public List<TSalaryAccount> getListByIdList(List<String> idList) {
return baseMapper.getListByIdList(idList);
}
}
......@@ -35,6 +35,7 @@ import com.yifu.cloud.plus.v1.check.entity.TCheckBankNo;
import com.yifu.cloud.plus.v1.check.entity.TCheckIdCard;
import com.yifu.cloud.plus.v1.check.entity.TCheckMobile;
import com.yifu.cloud.plus.v1.check.vo.CheckBankNoVo;
import com.yifu.cloud.plus.v1.check.vo.CheckBatchVo;
import com.yifu.cloud.plus.v1.yifu.archives.entity.TSettleDomain;
import com.yifu.cloud.plus.v1.yifu.common.core.constant.CacheConstants;
import com.yifu.cloud.plus.v1.yifu.common.core.constant.CommonConstants;
......@@ -290,6 +291,72 @@ public class TSalaryEmployeeServiceImpl extends ServiceImpl<TSalaryEmployeeMappe
return null;
}
@Override
public String saveNewEmployeeList(List<TSalaryEmployee> saveNewEmpList, List<ErrorMessage> errorList) {
if (saveNewEmpList != null && !saveNewEmpList.isEmpty()) {
// 银行卡
List<TCheckBankNo> bankList = new ArrayList<>();
List<String> phoneList = new ArrayList<>();
TCheckBankNo checkBankNo;
for (TSalaryEmployee employee : saveNewEmpList) {
if (Common.isNotNull(employee.getBankNo()) && (Common.isEmpty(employee.getIssueStatus()) || employee.getIssueStatus().equals(CommonConstants.ZERO_INT))) {
checkBankNo = new TCheckBankNo();
checkBankNo.setName(employee.getEmpName());
checkBankNo.setBankNo(employee.getBankNo());
bankList.add(checkBankNo);
}
if (Common.isNotNull(employee.getEmpPhone())) {
phoneList.add(employee.getEmpPhone());
}
}
// 批量校验 卡号与手机号
Map<String, Boolean> bankMap = new HashMap<>();
Map<String, Boolean> phoneMap = new HashMap<>();
if (!bankList.isEmpty()) {
R<CheckBatchVo> checkListR = HttpDaprUtil.invokeMethodPost(checkProperties.getAppUrl(), checkProperties.getAppId()
, "/tcheckbankno/inner/checkBankNoBatch", bankList, CheckBatchVo.class, SecurityConstants.FROM_IN);
if (checkListR != null && checkListR.getData() != null) {
bankMap = checkListR.getData().getCheckMap();
}
}
if (!phoneList.isEmpty()) {
R<CheckBatchVo> phoneR = HttpDaprUtil.invokeMethodPost(checkProperties.getAppUrl(), checkProperties.getAppId()
, "/tcheckmobile/inner/checkMobileBatch", phoneList, CheckBatchVo.class, SecurityConstants.FROM_IN);
if (phoneR != null && phoneR.getData() != null) {
phoneMap = phoneR.getData().getCheckMap();
}
}
boolean isFalse = false;
for (TSalaryEmployee employee : saveNewEmpList) {
if (bankMap.get(employee.getBankNo()) != null) {
if (Boolean.FALSE.equals(bankMap.get(employee.getBankNo()))) {
errorList.add(new ErrorMessage((employee.getLineNums() + 2), "第" + (employee.getLineNums() + 2) + "行:该员工新建失败:【姓名与卡号验证:认证不一致】"));
isFalse = true;
}
} else {
errorList.add(new ErrorMessage((employee.getLineNums() + 2), "第" + (employee.getLineNums() + 2) + "行:该员工新建失败:【姓名与卡号验证:" + SalaryConstants.CHECK_NO_RESPONSE + "】"));
isFalse = true;
}
if (phoneMap.get(employee.getEmpPhone()) != null) {
if (Boolean.FALSE.equals(phoneMap.get(employee.getEmpPhone()))) {
errorList.add(new ErrorMessage((employee.getLineNums() + 2), "第" + (employee.getLineNums() + 2) + "行:该员工新建失败:【手机号验证:手机号错误】"));
isFalse = true;
}
} else {
errorList.add(new ErrorMessage((employee.getLineNums() + 2), "第" + (employee.getLineNums() + 2) + "行:该员工新建失败:【手机号验证:" + SalaryConstants.CHECK_NO_RESPONSE + "】"));
isFalse = true;
}
}
if (isFalse) {
return null;
}
this.saveBatch(saveNewEmpList);
}
return null;
}
/**
* @param employee
* @Description: 校验卡号与手机号
......@@ -530,6 +597,18 @@ public class TSalaryEmployeeServiceImpl extends ServiceImpl<TSalaryEmployeeMappe
return baseMapper.getByEmpIdCard(empIdCard);
}
@Override
public Map<String, TSalaryEmployee> getByEmpIdCardList(List<String> idCardList) {
List<TSalaryEmployee> empList = baseMapper.getListByIdCard(idCardList);
Map<String, TSalaryEmployee> map = new HashMap<>();
if (empList != null && !empList.isEmpty()) {
for (TSalaryEmployee e : empList) {
map.put(e.getEmpIdcard(), e);
}
}
return map;
}
/**
* @param employee
* @Description: 代发户的,下次校验银行卡,同时变更校验flag
......@@ -560,6 +639,39 @@ public class TSalaryEmployeeServiceImpl extends ServiceImpl<TSalaryEmployeeMappe
}
}
@Override
public boolean checkBankInfoList(List<TSalaryEmployee> empList, List<ErrorMessage> errorList) {
// 批量校验 卡号与手机号
Map<String, Boolean> bankMap = new HashMap<>();
List<TCheckBankNo> bankList = new ArrayList<>();
TCheckBankNo checkBankNo;
for (TSalaryEmployee employee : empList) {
if (Common.isNotNull(employee.getBankNo())) {
checkBankNo = new TCheckBankNo();
checkBankNo.setName(employee.getEmpName());
checkBankNo.setBankNo(employee.getBankNo());
bankList.add(checkBankNo);
}
}
if (!bankList.isEmpty()) {
R<CheckBatchVo> checkListR = HttpDaprUtil.invokeMethodPost(checkProperties.getAppUrl(), checkProperties.getAppId()
, "/tcheckbankno/inner/checkBankNoBatch", bankList, CheckBatchVo.class, SecurityConstants.FROM_IN);
if (checkListR != null && checkListR.getData() != null) {
bankMap = checkListR.getData().getCheckMap();
}
for (TSalaryEmployee employee : empList) {
employee.setIssueStatus(CommonConstants.ZERO_INT);
if (bankMap.get(employee.getBankNo()) != null && Boolean.FALSE.equals(bankMap.get(employee.getBankNo()))) {
errorList.add(new ErrorMessage((employee.getLineNums() + 2), "第" + (employee.getLineNums() + 2)
+ "行:-上次代发户未校验【姓名与卡号】,本次校验结果:不匹配。请去薪酬人员查询处更新卡号信息!"));
return false;
}
}
this.saveBatch(empList);
}
return true;
}
/**
* @param vo
* @Description: 批量更新-薪资人员信息
......
......@@ -16,6 +16,7 @@
*/
package com.yifu.cloud.plus.v1.yifu.salary.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
......@@ -33,7 +34,6 @@ import com.yifu.cloud.plus.v1.yifu.common.core.constant.CommonConstants;
import com.yifu.cloud.plus.v1.yifu.common.core.constant.SecurityConstants;
import com.yifu.cloud.plus.v1.yifu.common.core.util.Common;
import com.yifu.cloud.plus.v1.yifu.common.core.util.DateUtil;
import com.yifu.cloud.plus.v1.yifu.common.core.util.ExcelUtil;
import com.yifu.cloud.plus.v1.yifu.common.core.util.R;
import com.yifu.cloud.plus.v1.yifu.common.core.vo.YifuUser;
import com.yifu.cloud.plus.v1.yifu.common.dapr.config.DaprArchivesProperties;
......@@ -49,6 +49,7 @@ import com.yifu.cloud.plus.v1.yifu.salary.mapper.TSalaryStandardMapper;
import com.yifu.cloud.plus.v1.yifu.salary.service.*;
import com.yifu.cloud.plus.v1.yifu.salary.util.DoJointSalaryAsyncTask;
import com.yifu.cloud.plus.v1.yifu.salary.util.SalaryConstants;
import com.yifu.cloud.plus.v1.yifu.salary.vo.AccountByEkpDiffVo;
import com.yifu.cloud.plus.v1.yifu.salary.vo.TSalaryStandardExportVo;
import com.yifu.cloud.plus.v1.yifu.salary.vo.TSalaryStandardSearchVo;
import com.yifu.cloud.plus.v1.yifu.social.entity.TIncome;
......@@ -63,11 +64,9 @@ import org.springframework.stereotype.Service;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.*;
/**
* 标准薪酬工资表
......@@ -83,6 +82,7 @@ public class TSalaryStandardServiceImpl extends ServiceImpl<TSalaryStandardMappe
private final TApprovalRecordService approvalRecordService;
private final TSalaryAccountService salaryAccountService;
private final TSalaryAccountItemService salaryAccountItemService;
private final MSalaryEstimateService mSalaryEstimateService;
private final DaprSocialProperties socialProperties;
private final DaprArchivesProperties archivesProperties;
......@@ -916,4 +916,126 @@ public class TSalaryStandardServiceImpl extends ServiceImpl<TSalaryStandardMappe
return R.failed("请耐心等待!");
}
}
/**
* @param voList
* @Description: 差额单--EKP调用接口
* @Author: hgw
* @Date: 2023/1/31 17:29
* @return: com.yifu.cloud.plus.v1.yifu.common.core.util.R<java.lang.String>
**/
public R<String> saveSalaryDiff(List<AccountByEkpDiffVo> voList) {
if (voList != null && !voList.isEmpty()) {
List<String> accIdList = new ArrayList<>();
for (AccountByEkpDiffVo vo : voList) {
if (Common.isEmpty(vo.getAccountId()) || Common.isEmpty(vo.getRelaySalary())
|| Common.isEmpty(vo.getActualSalary()) || Common.isEmpty(vo.getSalaryTax())) {
return R.failed("参数不可为空");
}
accIdList.add(vo.getAccountId());
}
List<TSalaryAccount> accountList = salaryAccountService.getListByIdList(accIdList);
if (accountList != null && !accountList.isEmpty()) {
Map<String, TSalaryAccount> accountMap = new HashMap<>();
for (TSalaryAccount account : accountList) {
accountMap.put(account.getId(), account);
}
List<TSalaryAccount> newAccountList = new ArrayList<>();
TSalaryAccount oldAccount;
TSalaryAccount newAccount;
BigDecimal allRelaySalary = BigDecimal.ZERO;
for (AccountByEkpDiffVo idVo : voList) {
oldAccount = accountMap.get(idVo.getAccountId());
if (oldAccount == null) {
return R.failed("未找到id为:【" + idVo.getAccountId() + "】的表");
} else {
newAccount = new TSalaryAccount();
BeanUtil.copyProperties(oldAccount, newAccount);
this.deleteAccountBaseInfo(newAccount);
newAccount.setRelaySalary(idVo.getRelaySalary());
newAccount.setActualSalary(idVo.getActualSalary());
newAccount.setSalaryTax(idVo.getSalaryTax());
newAccount.setIsDiff(CommonConstants.ONE_STRING);
newAccountList.add(newAccount);
allRelaySalary = allRelaySalary.add(idVo.getRelaySalary());
}
}
TSalaryStandard oldSalary = this.getById(accountList.get(CommonConstants.ZERO_INT).getSalaryFormId());
if (oldSalary == null) {
return R.failed("未找到工资表!");
}
TSalaryStandard newSalary = new TSalaryStandard();
BeanUtil.copyProperties(oldSalary, newSalary);
newSalary.setId(null);
newSalary.setSettlementAmount(allRelaySalary);
newSalary.setIsDiff(CommonConstants.ONE_STRING);
this.save(newSalary);
int i = 1;
TSalaryAccountItem relayItem;
TSalaryAccountItem actualItem;
TSalaryAccountItem taxItem;
for (TSalaryAccount account : newAccountList) {
account.setSalaryFormId(newSalary.getId());
account.setRowIndex(i);
salaryAccountService.save(account);
// 应发
relayItem = new TSalaryAccountItem();
relayItem.setSalaryAccountId(account.getId());
relayItem.setJavaFiedName(SalaryConstants.RELAY_SALARY_JAVA);
relayItem.setCnName(SalaryConstants.RELAY_SALARY);
relayItem.setSalaryMoney(account.getRelaySalary());
relayItem.setIsTax(CommonConstants.ZERO_INT);
salaryAccountItemService.save(relayItem);
// 实发
actualItem = new TSalaryAccountItem();
actualItem.setSalaryAccountId(account.getId());
actualItem.setJavaFiedName(SalaryConstants.ACTUAL_SALARY_SUM_JAVA);
actualItem.setCnName(SalaryConstants.ACTUAL_SALARY_SUM);
actualItem.setSalaryMoney(account.getActualSalary());
actualItem.setIsTax(CommonConstants.ZERO_INT);
salaryAccountItemService.save(actualItem);
// 个税
taxItem = new TSalaryAccountItem();
taxItem.setSalaryAccountId(account.getId());
taxItem.setJavaFiedName(SalaryConstants.SALARY_TAX_JAVA);
taxItem.setCnName(SalaryConstants.SALARY_TAX);
taxItem.setSalaryMoney(account.getSalaryTax());
taxItem.setIsTax(CommonConstants.ZERO_INT);
salaryAccountItemService.save(taxItem);
i++;
}
return R.ok();
}
}
return R.failed("未找到工资表!");
}
/**
* @param newAccount
* @Description: 复制原报账信息后,清空无关列
* @Author: hgw
* @Date: 2023/2/3 11:28
* @return: void
**/
private void deleteAccountBaseInfo(TSalaryAccount newAccount) {
newAccount.setId(null);
newAccount.setRelaySalaryUnit(null);
newAccount.setSalaryTaxUnit(null);
newAccount.setUnitSocial(null);
newAccount.setPersonSocial(null);
newAccount.setUnitFund(null);
newAccount.setPersonFund(null);
newAccount.setSumChildEduMoney(null);
newAccount.setSumContinuingEducationMoney(null);
newAccount.setSumHousingLoanMoney(null);
newAccount.setSumHousingRentMoney(null);
newAccount.setSumSupportElderlyMoney(null);
newAccount.setSumBabyMoney(null);
newAccount.setSumPrivatePension(null);
newAccount.setAnnualBonusTax(null);
}
}
......@@ -485,4 +485,21 @@
a.JAVA_FIED_NAME='actualSalarySum'
</select>
<select id="getListByAccIdList" resultMap="tSalaryAccountItemMap">
SELECT
ID,
SALARY_ACCOUNT_ID,
CN_NAME,
JAVA_FIED_NAME,
SALARY_MONEY,
TEXT_VALUE,
IS_TAX
FROM t_salary_account_item a
where a.SALARY_ACCOUNT_ID in
<foreach collection="accIdList" item="ids" open="(" separator="," close=")">
#{ids}
</foreach>
</select>
</mapper>
......@@ -96,6 +96,7 @@
<result property="incomeCollectFlag" column="INCOME_COLLECT_FLAG"/>
<result property="paySettleFlag" column="PAY_COLLECT_FLAG"/>
<result property="payCollectFlag" column="PAY_SETTLE_FLAG"/>
<result property="isDiff" column="IS_DIFF"/>
</resultMap>
<!-- B端薪酬第一个统计列表 -->
......@@ -272,7 +273,8 @@
a.SUM_SUPPORT_ELDERLY_MONEY,
a.SUM_CONTINUING_EDUCATION_MONEY,
a.SUM_BABY_MONEY,
a.SUM_PRIVATE_PENSION
a.SUM_PRIVATE_PENSION,
a.IS_DIFF
</sql>
<sql id="tSalaryAccount_where">
......@@ -412,6 +414,9 @@
<if test="tSalaryAccount.sendStatus != null">
AND a.SEND_STATUS = #{tSalaryAccount.sendStatus}
</if>
<if test="tSalaryAccount.isDiff != null and tSalaryAccount.isDiff.trim() != ''">
AND a.IS_DIFF = #{tSalaryAccount.isDiff}
</if>
</if>
</sql>
<!--tSalaryAccount简单分页查询-->
......@@ -511,6 +516,20 @@
and a.FORM_TYPE != '3' and a.FORM_TYPE != '4'
</select>
<!-- 获取当前年最小计税月 -->
<select id="getMinTaxMonthByNowYearAndList" resultMap="tSalaryAccountMap">
select
a.EMP_IDCARD,concat(min(a.TAX_MONTH - 0),'') TAX_MONTH
from t_salary_account a
where a.EMP_IDCARD in
<foreach collection="empIdCardList" item="ids" open="(" separator="," close=")">
#{ids}
</foreach>
and a.DELETE_FLAG = 0 and a.SETTLEMENT_MONTH like concat(#{nowYear},"%")
and a.FORM_TYPE != '3' and a.FORM_TYPE != '4'
group by a.EMP_IDCARD
</select>
<select id="getLastMonthTHaveSalaryNosocial" resultType="com.yifu.cloud.plus.v1.yifu.salary.entity.THaveSalaryNosocial">
select a.EMP_ID employee_id
, a.EMP_IDCARD employee_id_card
......@@ -682,7 +701,7 @@
ap.AREA_NAME BANK_PROVINCE,
ac.AREA_NAME BANK_CITY,
a.IS_PERSON_TAX,
ifnull(a.RELAY_SALARY,0) + ifnull(a.RELAY_SALARY_UNIT,0) RELAY_SALARY,
if(a.RELAY_SALARY_UNIT is not null and a.RELAY_SALARY_UNIT != 0,a.RELAY_SALARY_UNIT,ifnull(a.RELAY_SALARY,0)) RELAY_SALARY,
a.ACTUAL_SALARY,
ifnull(a.SALARY_TAX,0) + ifnull(a.SALARY_TAX_UNIT,0) SALARY_TAX,
a.CREATE_NAME,
......@@ -699,7 +718,8 @@
a.SUM_SUPPORT_ELDERLY_MONEY,
a.SUM_CONTINUING_EDUCATION_MONEY,
a.SUM_BABY_MONEY,
a.SUM_PRIVATE_PENSION
a.SUM_PRIVATE_PENSION,
case a.FORM_TYPE when '0' then '薪资' when '1' then '绩效' when '3' then '劳务费' when '4' then '稿酬' else '其他' end as FORM_TYPE
FROM
<if test="searchVo.salaryMonthStart == null or searchVo.salaryMonthStart.trim() >= '202201'">
t_salary_account a
......@@ -998,4 +1018,15 @@
AND a.SALARY_MONTH like concat(#{salaryAccountAndItemVo.years},'%')
</if>
</select>
<!-- 根据idList获取报账信息 -->
<select id="getListByIdList" resultMap="tSalaryAccountMap">
select
<include refid="Base_Column_List"/>
from t_salary_account a
where a.id in
<foreach collection="idList" item="ids" open="(" separator="," close=")">
#{ids}
</foreach>
</select>
</mapper>
......@@ -78,6 +78,7 @@
<result property="incomeStartTime" column="INCOME_START_TIME"/>
<result property="incomeEndTime" column="INCOME_END_TIME"/>
<result property="issueStatus" column="ISSUE_STATUS"/>
<result property="isDiff" column="IS_DIFF"/>
</resultMap>
<sql id="Base_Column_List">
a.ID,
......@@ -134,7 +135,8 @@
a.APPLY_NO,
a.INCOME_START_TIME,
a.INCOME_END_TIME,
a.ISSUE_STATUS
a.ISSUE_STATUS,
a.IS_DIFF
</sql>
<sql id="tSalaryStandard_where">
<if test="tSalaryStandard != null">
......@@ -279,6 +281,9 @@
<if test="tSalaryStandard.applyNo != null and tSalaryStandard.applyNo.trim() != ''">
AND a.APPLY_NO like concat('%',#{tSalaryStandard.applyNo},'%')
</if>
<if test="tSalaryStandard.isDiff != null and tSalaryStandard.isDiff.trim() != ''">
AND a.IS_DIFF = #{tSalaryStandard.isDiff}
</if>
</if>
</sql>
<!--tSalaryStandard简单分页查询-->
......
......@@ -396,6 +396,19 @@ public class TDispatchInfo extends BaseEntity {
/**
* 社保办理状态 0 未办理 1 全部办理成功(原-已办理) 2 全部办理失败(原-办理失败) 3 部分办理成功 4 办理中
*
* 20230131 MVP1.5.0版本新增拆分派减逻辑:
* 1、派减状态:增加:办理中(派减存在未处理完的事项时,状态为“办理中”)、部分办理失败状态(派减全部事项处理完毕,存在办理失败的事项)——同派增状态保持一致
* 2、预估数据逻辑:仅当派减办理成功状态时,才会不生成次月预估费用;未办理、办理中、部分办理失败都是全额生成社保预估费用;
* 3、档案查询中的状态沿用派增的处理中和部分购买;
* 4、新增三种无需审核的合同需测试验证;
* 5、派减全部减掉之后,在社保公积金查询处,将“停缴日期”调整为“最迟停缴日期”,取最后一次的办理成功时客服导表中填写的停缴日期,精确到日;
* 6、社保公积金查询、派单查询、档案查询-社保详情中,针对派减的在下方明细处增加“停缴日期”列,显示到“年月日”;
* 7、流程进展明细中,将分项减员的操作记录按照操作人、操作时间、派减项进行记录;
* 8、社保公积金查询处,查询条件:社保状态-增加“派减-办理中”、”派减-部分办理失败“,支持查询、列表正常显示、及导出;
* 9、批量办理界面呈现效果按照芳利拍照的效果呈现;
* 10、针对派单-部分派减的,需判断是否有流程中的数据,如果有,不允许再次发起;仅当派单项全部为完结状态,并且有未派减项,才允许发起派减;
* 11、增加查询项-”派单项“下拉多选——养老、工伤、失业、医保、生育、大病;搜索项只要有重叠的都可以被检索到;
*/
@Length(max = 1, message = "社保办理状态 不能超过1个字符" )
@ExcelAttribute(name = "社保办理状态", maxLength = 1)
......
......@@ -48,7 +48,6 @@ public class TPaymentInfo extends BaseEntity {
/**
* 主键
*/
@TableId(type = IdType.ASSIGN_ID)
@Schema(description ="主键")
private String id;
......
/*
* Copyright (c) 2018-2025, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the yifu4cloud.com developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: lengleng (wangiegie@gmail.com)
*/
package com.yifu.cloud.plus.v1.yifu.social.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 社保合并推送id记录表
*
* @author huyc
* @date 2023-2-9 16:11:24
*/
@Data
@TableName("t_payment_social_push")
@Schema(description = "社保合并推送id记录表")
public class TPaymentSocialPush {
@TableId(type = IdType.ASSIGN_ID)
@Schema(description = "主键")
private String id;
@Schema(description = "社保明细id拼接字符")
private String paymentIds;
@Schema(description = "结算状态0 已结算 1 未结算")
private Integer status;
}
......@@ -293,6 +293,15 @@ public class TProvidentFund extends BaseEntity {
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("审核人" )
private String auditUser;
/**
* 审核人姓名
*/
@ExcelAttribute(name = "审核人姓名", maxLength = 32)
@Schema(description = "审核人姓名" )
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("审核人姓名" )
private String auditUserName;
/**
* 审核时间
*/
......@@ -310,6 +319,16 @@ public class TProvidentFund extends BaseEntity {
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("办理人" )
private String handleUser;
/**
* 办理人姓名
*/
@Length(max = 32, message = "办理人姓名 不能超过32个字符" )
@ExcelAttribute(name = "办理人姓名", maxLength = 32)
@Schema(description = "办理人姓名" )
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("办理人姓名" )
private String handleUserName;
/**
* 办理时间
*/
......
......@@ -32,58 +32,59 @@ public class SocialHandleExportVo implements Serializable {
private String type;
/**
* 社保办理状态 0 未办理 1 全部办理成功(原-已办理) 2 全部办理失败(原-办理失败) 3已派减 4办理中 (20210609派单拆分新增fxj) 5部分办理失败
* 社保办理状态 0 未办理 1 全部办理成功(原-已办理) 2 全部办理失败(原-办理失败) 3已派减 4办理中 (20210609派单拆分新增fxj) 5部分办理失败 6 派减办理中 7 派减部分办理失败
* 0 未办理 1 全部办理成功(原-已办理) 2 全部办理失败(原-办理失败) 3 部分办理成功 4 办理中
*/
@Schema(description = "社保办理状态")
@ExcelAttribute(name = "社保办理状态", readConverterExp = "0=未办理,1=全部办理成功,2=全部办理失败,3=已派减,4=办理中,5=部分办理失败", needExport = true)
@ExcelAttribute(name = "社保办理状态", readConverterExp = "0=未办理,1=全部办理成功,2=全部办理失败,3=部分办理成功,4=办理中", needExport = true)
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("社保办理状态" )
private String socialHandleStatus;
/**
* 养老办理状态:0待办理1办理成功2办理失败3已派减
* 养老办理状态:0待办理1办理成功2办理失败3已派减4派减失败
*/
@ExcelAttribute(name = "养老状态" , maxLength = 1 , readConverterExp = "0=待办理,1=办理成功,2=办理失败,3=已派减,null=——", needExport = true)
@ExcelAttribute(name = "养老状态" , maxLength = 1 , readConverterExp = "0=派增待办理,1=派增办理成功,2=派增办理失败,3=派增已派减,4=派减失败,5=派减待办理,null=——", needExport = true)
@Schema(description="养老办理状态:0待办理1办理成功2办理失败3已派减")
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("养老状态" )
private String pensionHandle;
/**
* 医疗办理状态:0待办理1办理成功2办理失败3已派减
* 医疗办理状态:0待办理1办理成功2办理失败3已派减4派减失败
*/
@ExcelAttribute(name = "医疗状态" , maxLength = 1 , readConverterExp = "0=待办理,1=办理成功,2=办理失败,3=已派减,null=——", needExport = true)
@ExcelAttribute(name = "医疗状态" , maxLength = 1 , readConverterExp = "0=派增待办理,1=派增办理成功,2=派增办理失败,3=派增已派减,4=派减失败,5=派减待办理,null=——", needExport = true)
@Schema(description="医疗办理状态:0待办理1办理成功2办理失败3已派减")
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("医疗状态" )
private String medicalHandle;
/**
* 失业办理状态:0待办理1办理成功2办理失败3已派减
* 失业办理状态:0待办理1办理成功2办理失败3已派减4派减失败
*/
@ExcelAttribute(name = "失业状态" , maxLength = 1 , readConverterExp = "0=待办理,1=办理成功,2=办理失败,3=已派减,null=——", needExport = true)
@ExcelAttribute(name = "失业状态" , maxLength = 1 , readConverterExp = "0=派增待办理,1=派增办理成功,2=派增办理失败,3=派增已派减,4=派减失败,5=派减待办理,null=——", needExport = true)
@Schema(description="失业办理状态:0待办理1办理成功2办理失败3已派减")
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("失业状态" )
private String unemployHandle;
/**
* 工伤办理状态:0待办理1办理成功2办理失败3已派减
* 工伤办理状态:0待办理1办理成功2办理失败3已派减4派减失败
*/
@ExcelAttribute(name = "工伤状态" , maxLength = 1 , readConverterExp = "0=待办理,1=办理成功,2=办理失败,3=已派减,null=——", needExport = true)
@ExcelAttribute(name = "工伤状态" , maxLength = 1 , readConverterExp = "0=派增待办理,1=派增办理成功,2=派增办理失败,3=派增已派减,4=派减失败,5=派减待办理,null=——", needExport = true)
@Schema(description="工伤办理状态:0待办理1办理成功2办理失败3已派减")
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("工伤状态" )
private String workInjuryHandle;
/**
* 生育办理状态:0待办理1办理成功2办理失败3已派减
* 生育办理状态:0待办理1办理成功2办理失败3已派减4派减失败
*/
@ExcelAttribute(name = "生育状态" , maxLength = 1 , readConverterExp = "0=待办理,1=办理成功,2=办理失败,3=已派减,null=——", needExport = true)
@ExcelAttribute(name = "生育状态" , maxLength = 1 , readConverterExp = "0=派增待办理,1=派增办理成功,2=派增办理失败,3=派增已派减,4=派减失败,5=派减待办理,null=——", needExport = true)
@Schema(description="生育办理状态:0待办理1办理成功2办理失败3已派减")
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("生育状态" )
private String birthHandle;
/**
* 大病办理状态:0待办理1办理成功2办理失败3已派减
* 大病办理状态:0待办理1办理成功2办理失败3已派减4派减失败
*/
@ExcelAttribute(name = "大病状态" , maxLength = 1 , readConverterExp = "0=待办理,1=办理成功,2=办理失败,3=已派减,null=——", needExport = true)
@ExcelAttribute(name = "大病状态" , maxLength = 1 , readConverterExp = "0=派增待办理,1=派增办理成功,2=派增办理失败,3=派增已派减,4=派减失败,5=派减待办理,null=——", needExport = true)
@Schema(description="大病办理状态:0待办理1办理成功2办理失败3已派减")
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("大病状态" )
......
......@@ -8,6 +8,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
/**
* @Author fxj
......@@ -67,4 +68,11 @@ public class SocialHandleSearchVo extends TDispatchInfo {
@Schema(description = "审核时间截止时间" )
@ExcelIgnore
private String auditTimeEnd;
/**
* 派单项:如 养老、公积金
*/
@ExcelAttribute(name = "派单项查询")
@Schema(description = "派单项查询" )
private List<String> dispatchItems;
}
......@@ -26,6 +26,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotBlank;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
......@@ -267,6 +268,26 @@ public class TDispatchInfoExportVo {
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("公积金办理时间" )
private Date fundHandleTime;
/**
* 公积金缴纳基数
*/
@NotBlank(message = "公积金缴纳基数不能为空" )
@ExcelAttribute(name = "公积金缴纳基数", isNotEmpty = true, errorInfo = "公积金缴纳基数不能为空" )
@Schema(description = "公积金缴纳基数" )
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("公积金缴纳基数" )
private BigDecimal unitProvidengCardinal;
/**
* 公积金缴纳比例
*/
@ExcelAttribute(name = "公积金缴纳比例" )
@Schema(description = "公积金缴纳比例" )
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("公积金缴纳比例" )
private BigDecimal unitProvidentPer;
/**
* 养老基数
*/
......@@ -374,43 +395,43 @@ public class TDispatchInfoExportVo {
@ExcelProperty("申请编码")
private String applyNo;
@ExcelAttribute(name = "社保办理状态", readConverterExp = "0=待办理,1=办理成功,2=办理失败,3=部分办理失败,4=办理中")
//@ExcelAttribute(name = "社保办理状态", readConverterExp = "0=待办理,1=办理成功,2=办理失败,3=部分办理失败,4=办理中")
@Schema(description = "社保办理状态 0 待办理 1 办理成功 2 办理失败 3 部分办理失败 4 办理中")
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("社保办理状态")
private String socialHandleStatus;
@ExcelAttribute(name = "养老办理状态", readConverterExp = "0=待办理,1=办理成功,2=办理失败,3=已派减")
//@ExcelAttribute(name = "养老办理状态", readConverterExp = "0=待办理,1=办理成功,2=办理失败,3=已派减")
@Schema(description = "养老办理状态:0待办理1办理成功2办理失败3已派减" )
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("养老办理状态" )
private String pensionHandle;
@ExcelAttribute(name = "医疗办理状态", readConverterExp = "0=待办理,1=办理成功,2=办理失败,3=已派减")
//@ExcelAttribute(name = "医疗办理状态", readConverterExp = "0=待办理,1=办理成功,2=办理失败,3=已派减")
@Schema(description = "医疗办理状态:0待办理1办理成功2办理失败3已派减" )
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("医疗办理状态" )
private String medicalHandle;
@ExcelAttribute(name = "失业办理状态", readConverterExp = "0=待办理,1=办理成功,2=办理失败,3=已派减")
//@ExcelAttribute(name = "失业办理状态", readConverterExp = "0=待办理,1=办理成功,2=办理失败,3=已派减")
@Schema(description = "失业办理状态:0待办理1办理成功2办理失败3已派减" )
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("失业办理状态" )
private String unemployHandle;
@ExcelAttribute(name = "工伤办理状态", readConverterExp = "0=待办理,1=办理成功,2=办理失败,3=已派减")
//@ExcelAttribute(name = "工伤办理状态", readConverterExp = "0=待办理,1=办理成功,2=办理失败,3=已派减")
@Schema(description = "工伤办理状态:0待办理1办理成功2办理失败3已派减" )
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("工伤办理状态" )
private String workInjuryHandle;
@ExcelAttribute(name = "生育办理状态", readConverterExp = "0=待办理,1=办理成功,2=办理失败,3=已派减")
//@ExcelAttribute(name = "生育办理状态", readConverterExp = "0=待办理,1=办理成功,2=办理失败,3=已派减")
@Schema(description = "生育办理状态:0待办理1办理成功2办理失败3已派减" )
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("生育办理状态" )
private String birthHandle;
@ExcelAttribute(name = "大病办理状态", readConverterExp = "0=待办理,1=办理成功,2=办理失败,3=已派减")
//@ExcelAttribute(name = "大病办理状态", readConverterExp = "0=待办理,1=办理成功,2=办理失败,3=已派减")
@Schema(description = "大病办理状态:0待办理1办理成功2办理失败3已派减" )
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("大病办理状态" )
......@@ -449,5 +470,4 @@ public class TDispatchInfoExportVo {
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("公积金办理备注" )
private String fundHandleRemark;
}
......@@ -26,7 +26,6 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import java.util.Set;
......@@ -110,4 +109,10 @@ public class TDispatchInfoSearchVo extends TDispatchInfo {
@ExcelIgnore
private String auditTimeEnd;
/**
* 派单项:如 养老、公积金
*/
@ExcelAttribute(name = "派单项查询")
@Schema(description = "派单项查询" )
private List<String> dispatchItems;
}
/*
* Copyright (c) 2018-2025, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the yifu4cloud.com developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: lengleng (wangiegie@gmail.com)
*/
package com.yifu.cloud.plus.v1.yifu.social.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.HeadFontStyle;
import com.yifu.cloud.plus.v1.yifu.common.core.constant.ExcelAttribute;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* 缴费库合并推送参数
* @author huyc
* @date 2023-2-10 10:01:22
*/
@Data
public class TPaymentInfoPushVo implements Serializable {
/**
* 主键
*/
@Schema(description ="主键")
private String id;
/**
* 主键拼接
*/
@Schema(description ="主键拼接")
private String ids;
/**
* 员工姓名
*/
@ExcelAttribute(name = "员工姓名" )
@Schema(description ="员工姓名")
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("员工姓名")
private String empName;
/**
* 身份证号
*/
@ExcelAttribute(name = "身份证号" )
@Schema(description ="身份证号")
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("身份证号")
private String empIdcard;
/**
* 客户名称
*/
@ExcelAttribute(name = "客户名称" )
@Schema(description ="客户名称")
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("客户名称")
private String unitName;
/**
* 项目名称
*/
@ExcelAttribute(name = "项目名称" )
@Schema(description ="项目名称")
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("项目名称")
private String settleDomainName;
/**
* 项目编码
*/
@ExcelAttribute(name = "项目编码", maxLength = 50)
@Schema(description = "项目编码" )
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("项目编码" )
private String settleDomainCode;
/**
* 社保户
*/
@ExcelAttribute(name = "社保户" )
@Schema(description ="社保户")
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("社保户")
private String socialHousehold;
/**
* 社保缴纳地
*/
@ExcelAttribute(name = "社保缴纳地" )
@Schema(description ="社保缴纳地")
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("社保缴纳地")
private String socialPayAddr;
/**
* 社保缴纳月份
*/
@ExcelAttribute(name = "社保缴纳月份")
@Schema(description ="社保缴纳月份")
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("社保缴纳月份")
private String socialPayMonth;
/**
* 社保生成月份
*/
@ExcelAttribute(name = "社保生成月份")
@Schema(description ="社保生成月份")
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("社保生成月份")
private String socialCreateMonth;
/**
* 总合计
*/
@ExcelAttribute(name = "总合计" )
@Schema(description ="总合计")
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("总合计")
private BigDecimal sumAll;
/**
* 社保合计
*/
@ExcelAttribute(name = "社保合计" )
@Schema(description ="社保合计")
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("社保合计")
private BigDecimal socialSum;
/**
* 单位社保合计
*/
@ExcelAttribute(name = "单位社保合计" )
@Schema(description ="单位社保合计")
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("单位社保合计")
private BigDecimal unitSocialSum;
/**
* 个人社保合计
*/
@ExcelAttribute(name = "个人社保合计" )
@Schema(description ="个人社保合计")
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("个人社保合计")
private BigDecimal socialSecurityPersonalSum;
/**
* 单位社保补缴利息
*/
@ExcelAttribute(name = "单位社保补缴利息" )
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("单位社保补缴利息")
private BigDecimal companyAccrual;
/**
* 个人社保补缴利息
*/
@ExcelAttribute(name = "个人社保补缴利息" )
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("个人社保补缴利息")
private BigDecimal personalAccrual;
/**
* 单位养老金额
*/
@ExcelAttribute(name = "单位养老金额")
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("单位养老金额")
private BigDecimal unitPensionMoney;
/**
* 单位医疗金额
*/
@ExcelAttribute(name = "单位医疗金额")
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("单位医疗金额")
private BigDecimal unitMedicalMoney;
/**
* 单位失业金额
*/
@ExcelAttribute(name = "单位失业金额")
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("单位失业金额")
private BigDecimal unitUnemploymentMoney;
/**
* 单位工伤金额
*/
@ExcelAttribute(name = "单位工伤金额")
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("单位工伤金额")
private BigDecimal unitInjuryMoney;
/**
* 单位生育金额
*/
@ExcelAttribute(name = "单位生育金额")
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("单位生育金额")
private BigDecimal unitBirthMoney;
/**
* 单位大病金额
*/
@ExcelAttribute(name = "单位大病金额")
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("单位大病金额")
private BigDecimal unitBigmailmentMoney;
/**
* 个人养老金额
*/
@ExcelAttribute(name = "个人养老金额")
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("个人养老金额")
private BigDecimal personalPensionMoney;
/**
* 个人医疗金额
*/
@ExcelAttribute(name = "个人医疗金额")
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("个人医疗金额")
private BigDecimal personalMedicalMoney;
/**
* 个人失业金额
*/
@ExcelAttribute(name = "个人失业金额")
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("个人失业金额")
private BigDecimal personalUnemploymentMoney;
/**
* 个人大病金额
*/
@ExcelAttribute(name = "个人大病金额")
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("个人大病金额")
private BigDecimal personalBigmailmentMoney;
/**
* 社保创建人姓名
*/
@ExcelAttribute(name = "社保创建人姓名")
@Schema(description = "社保创建人姓名")
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("社保创建人姓名")
private String createName;
/**
* 创建时间
*/
@Schema(description = "创建时间")
@HeadFontStyle(fontHeightInPoints = 11)
@ExcelProperty("创建时间")
private String createTime;
}
/*
* Copyright (c) 2018-2025, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the yifu4cloud.com developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: lengleng (wangiegie@gmail.com)
*/
package com.yifu.cloud.plus.v1.yifu.social.controller;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 社保合并推送id记录表
*
* @author huyc
* @date 2023-2-9 16:11:24
*/
@RestController
@RequiredArgsConstructor
@RequestMapping("/tpaymentsocialpush")
@Tag(name = "社保合并推送id记录表")
public class TPaymentSocialPushController {
}
......@@ -62,4 +62,13 @@ public interface SysBaseSetInfoMapper extends BaseMapper<SysBaseSetInfo> {
* @return
**/
List<SysBaseSetInfo> getFundBaseSet(@Param("fundHolds")List<String> fundHolds);
/**
* @param sysBaseSetInfo
* @Description: 编辑时查询有没有已存在的配置
* @Author: hgw
* @Date: 2023/2/15 18:15
* @return: int
**/
int getCountByEdit(@Param("sysBaseSetInfo") SysBaseSetInfo sysBaseSetInfo);
}
......@@ -67,6 +67,20 @@ public interface TPaymentInfoMapper extends BaseMapper<TPaymentInfo> {
*/
Integer selectCountSumPaymentInfo(@Param("tPaymentInfo") TPaymentInfoSearchVo searchVo);
/**
* 缴费库简单分页查询
* @param searchVo 缴费库
* @return
*/
List<TPaymentInfoPushVo> getTPaymentInfoSumPushList(@Param("tPaymentInfo") TPaymentInfoSearchVo searchVo);
/**
* 缴费库合并导出查询
* @param searchVo 缴费库
* @return
*/
Integer getTPaymentInfoSumPushCount(@Param("tPaymentInfo") TPaymentInfoSearchVo searchVo);
/**
* 缴费库简单分页查询
* @param searchVo 缴费库
......@@ -88,6 +102,20 @@ public interface TPaymentInfoMapper extends BaseMapper<TPaymentInfo> {
*/
int updateStatusById(@Param("tPaymentInfo")TPaymentInfo tPaymentInfo);
/**
* 更新结算状态
* @param sUpdateList 缴费库
* @return
*/
int updateBatchByIdList(@Param("details")List<TPaymentInfo> sUpdateList);
/**
* 更新结算状态
* @param sUpdateList 缴费库
* @return
*/
int updateBatchByIdList1(@Param("details")List<TPaymentInfo> sUpdateList);
/**
* 通过ID获取缴费库 及社保、公积金明细
* @param id
......@@ -95,6 +123,8 @@ public interface TPaymentInfoMapper extends BaseMapper<TPaymentInfo> {
**/
TPaymentInfoVo getAllInfoById(String id);
List<TPaymentInfo> getAllPushInfoById(@Param("idStr") String idStr);
/*
* 已存在社保缴费库数据 非删除状态
* @param months
......@@ -168,14 +198,6 @@ public interface TPaymentInfoMapper extends BaseMapper<TPaymentInfo> {
*/
List<String> getTPaymentInfoList(@Param("tPaymentInfo") TPaymentInfoSearchVo searchVo);
/**
* 缴费库社保推送查询
* @param searchVo 缴费库
* @return
*/
List<TPaymentInfo> getTPaymentSocialPushInfo(@Param("tPaymentInfo") TPaymentInfoSearchVo searchVo,
@Param("userId") String userId);
/**
* 缴费库公积金推送查询
* @param searchVo 缴费库
......@@ -202,18 +224,12 @@ public interface TPaymentInfoMapper extends BaseMapper<TPaymentInfo> {
void updateBySocialPayment(@Param("id")String id);
void updateBySocialPaymentList(@Param("idStr")String idStr);
void updateBySocialIncomePayment(@Param("id")String id);
void updateBySocialIncomeFlag(@Param("id")String id);
/**
* 缴费库社保推送查询
* @param searchVo 缴费库
* @return
*/
long getTPaymentSocialPushCount(@Param("tPaymentInfo") TPaymentInfoSearchVo searchVo,
@Param("userId") String userId);
/**
* 缴费库公积金推送查询
* @param searchVo 缴费库
......
/*
* Copyright (c) 2018-2025, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the yifu4cloud.com developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: lengleng (wangiegie@gmail.com)
*/
package com.yifu.cloud.plus.v1.yifu.social.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yifu.cloud.plus.v1.yifu.social.entity.TPaymentSocialPush;
import org.apache.ibatis.annotations.Mapper;
/**
* error存储
*
* @author hgw
* @date 2022-9-7 16:28:46
*/
@Mapper
public interface TPaymentSocialPushMapper extends BaseMapper<TPaymentSocialPush> {
}
......@@ -22,6 +22,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yifu.cloud.plus.v1.yifu.social.entity.SysPayProportion;
import java.util.List;
/**
* 公积金政策对应的缴费比例表
*
......@@ -36,4 +38,13 @@ public interface SysPayProportionService extends IService<SysPayProportion> {
* @return
*/
IPage<SysPayProportion> getSysPayProportionPage(Page<SysPayProportion> page, SysPayProportion sysPayProportion);
/**
* @param sysBaseSetId
* @Description: 获取比例
* @Author: hgw
* @Date: 2023/2/13 15:24
* @return: java.util.List<com.yifu.cloud.plus.v1.yifu.social.entity.SysPayProportion>
**/
List<SysPayProportion> getSysPayProportionByBaseId(String sysBaseSetId);
}
/*
* Copyright (c) 2018-2025, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the yifu4cloud.com developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: lengleng (wangiegie@gmail.com)
*/
package com.yifu.cloud.plus.v1.yifu.social.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yifu.cloud.plus.v1.yifu.social.entity.TPaymentSocialPush;
/**
* 收入明细表
*
* @author huyc
* @date 2023-2-9 16:11:24
*/
public interface TPaymentSocialPushService extends IService<TPaymentSocialPush> {
}
......@@ -144,7 +144,7 @@ public class SysBaseSetInfoServiceImpl extends ServiceImpl<SysBaseSetInfoMapper,
lastBase.setApplyEndDate(DateUtil.addDayByDate(sysBaseSetInfo.getApplyStartDate(), -1));
this.updateById(lastBase);
}
this.saveOrUpdateBaseAndFundPro(sysBaseSetInfo);
this.saveOrUpdateBaseAndFundPro(sysBaseSetInfo, null);
return R.ok();
}
......@@ -157,57 +157,23 @@ public class SysBaseSetInfoServiceImpl extends ServiceImpl<SysBaseSetInfoMapper,
SysBaseSetInfo old = this.getById(sysBaseSetInfo.getId());
if (old == null || Common.isEmpty(old.getId())) {
return R.failed("根据id未找到基数配置!" + sysBaseSetInfo.getId());
} else {
List<SysPayProportion> payProportionList = sysPayProportionService.getSysPayProportionByBaseId(sysBaseSetInfo.getId());
old.setFundProList(payProportionList);
}
SysBaseSetInfo baseSetInfo = null;
// where (b.apply_start_date < '2023-01' and ( b.apply_end_date > '2023-01' or b.apply_end_date is null) ) or b.apply_start_date > '2023-01'
if (null != sysBaseSetInfo.getTown()) {
baseSetInfo = this.getOne(Wrappers.<SysBaseSetInfo>query().lambda()
.eq(SysBaseSetInfo::getBaseType, sysBaseSetInfo.getBaseType())
.eq(SysBaseSetInfo::getDepartId, sysBaseSetInfo.getDepartId())
.eq(SysBaseSetInfo::getTown, sysBaseSetInfo.getTown())
.ne(SysBaseSetInfo::getId, sysBaseSetInfo.getId())
.eq(SysBaseSetInfo::getStatus, CommonConstants.ZERO_INT)
.and(obj -> obj
.ge(SysBaseSetInfo::getApplyStartDate, sysBaseSetInfo.getApplyStartDate())
.or()
.ge(SysBaseSetInfo::getApplyEndDate, sysBaseSetInfo.getApplyStartDate()))
.last(CommonConstants.LAST_ONE_SQL));
}
if (null != sysBaseSetInfo.getCity() && null == sysBaseSetInfo.getTown()) {
baseSetInfo = this.getOne(Wrappers.<SysBaseSetInfo>query().lambda()
.eq(SysBaseSetInfo::getBaseType, sysBaseSetInfo.getBaseType())
.eq(SysBaseSetInfo::getDepartId, sysBaseSetInfo.getDepartId())
.eq(SysBaseSetInfo::getCity, sysBaseSetInfo.getCity())
.isNull(SysBaseSetInfo::getTown)
.and(obj -> obj
.ge(SysBaseSetInfo::getApplyStartDate, sysBaseSetInfo.getApplyStartDate())
.or()
.ge(SysBaseSetInfo::getApplyEndDate, sysBaseSetInfo.getApplyStartDate()))
.ne(SysBaseSetInfo::getId, sysBaseSetInfo.getId())
.eq(SysBaseSetInfo::getStatus, CommonConstants.ZERO_INT)
.last(CommonConstants.LAST_ONE_SQL));
}
if (null != sysBaseSetInfo.getProvince() && null == sysBaseSetInfo.getCity()) {
baseSetInfo = this.getOne(Wrappers.<SysBaseSetInfo>query().lambda()
.eq(SysBaseSetInfo::getBaseType, sysBaseSetInfo.getBaseType())
.eq(SysBaseSetInfo::getDepartId, sysBaseSetInfo.getDepartId())
.eq(SysBaseSetInfo::getProvince, sysBaseSetInfo.getProvince())
.isNull(SysBaseSetInfo::getCity)
.and(obj -> obj
.ge(SysBaseSetInfo::getApplyStartDate, sysBaseSetInfo.getApplyStartDate())
.or()
.ge(SysBaseSetInfo::getApplyEndDate, sysBaseSetInfo.getApplyStartDate()))
.ne(SysBaseSetInfo::getId, sysBaseSetInfo.getId())
.eq(SysBaseSetInfo::getStatus, CommonConstants.ZERO_INT)
.last(CommonConstants.LAST_ONE_SQL));
}
if (null != baseSetInfo) {
return R.failed("对应户、地市、有效期的基数配置已存在!");
}
// 2023-2-16 09:38:24 晨会上产品经理倩倩确认,编辑时,时间日期不可编辑。
/*int count = baseMapper.getCountByEdit(sysBaseSetInfo)
if count > CommonConstants.ZERO_INT)
return R.failed("对应户、地市、有效期的基数配置已存在!")
*/
this.saveOrUpdateBaseAndFundPro(sysBaseSetInfo);
this.saveOrUpdateBaseAndFundPro(sysBaseSetInfo, old);
int type = CommonConstants.ONE_INT;
if (CommonConstants.ONE_STRING.equals(sysBaseSetInfo.getBaseType())) {
type = CommonConstants.TWO_INT;
}
// 记录变更日志
tSocialLogService.saveModificationRecord(CommonConstants.ONE_INT, old.getId(), old, sysBaseSetInfo);
tSocialLogService.saveModificationRecord(type, old.getId(), old, sysBaseSetInfo);
return R.ok();
}
......@@ -218,7 +184,7 @@ public class SysBaseSetInfoServiceImpl extends ServiceImpl<SysBaseSetInfoMapper,
* @Date: 2022/7/12 14:33
* @return: void
**/
private void saveOrUpdateBaseAndFundPro(SysBaseSetInfo sysBaseSetInfo) {
private void saveOrUpdateBaseAndFundPro(SysBaseSetInfo sysBaseSetInfo, SysBaseSetInfo old) {
if (Common.isNotNull(sysBaseSetInfo.getId())) {
baseMapper.updateById(sysBaseSetInfo);
} else {
......@@ -230,15 +196,34 @@ public class SysBaseSetInfoServiceImpl extends ServiceImpl<SysBaseSetInfoMapper,
//tForecastLibraryService.updateForecastLibaryBySysBase(sysBaseSetInfo)
}
List<SysPayProportion> payProportionList = sysBaseSetInfo.getFundProList();
Map<String, SysPayProportion> oldFundMap = new HashMap<>();
if (old != null && Common.isNotNull(old.getFundProList())) {
for (SysPayProportion payProportion : old.getFundProList()) {
oldFundMap.put(payProportion.getId(), payProportion);
}
}
if (Common.isNotNull(payProportionList)) {
for (SysPayProportion payProportion : payProportionList) {
if (Common.isNotNull(payProportion.getId())) {
sysPayProportionService.updateById(payProportion);
oldFundMap.remove(payProportion.getId());
} else {
payProportion.setSysBaseSetId(sysBaseSetInfo.getId());
sysPayProportionService.save(payProportion);
}
}
for (SysPayProportion payProportion : payProportionList) {
payProportion.setCreateBy(null);
payProportion.setCreateName(null);
payProportion.setCreateTime(null);
payProportion.setUpdateBy(null);
payProportion.setUpdateTime(null);
}
if (!oldFundMap.isEmpty()) {
for (SysPayProportion fund : oldFundMap.values()) {
sysPayProportionService.removeById(fund);
}
}
}
}
......
......@@ -24,6 +24,8 @@ import com.yifu.cloud.plus.v1.yifu.social.mapper.SysPayProportionMapper;
import com.yifu.cloud.plus.v1.yifu.social.service.SysPayProportionService;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 公积金政策对应的缴费比例表
*
......@@ -42,4 +44,9 @@ public class SysPayProportionServiceImpl extends ServiceImpl<SysPayProportionMap
public IPage<SysPayProportion> getSysPayProportionPage(Page<SysPayProportion> page, SysPayProportion sysPayProportion) {
return baseMapper.getSysPayProportionPage(page, sysPayProportion);
}
@Override
public List<SysPayProportion> getSysPayProportionByBaseId(String sysBaseSetId) {
return baseMapper.selectByPrimaryId(sysBaseSetId);
}
}
......@@ -14,23 +14,19 @@ import com.yifu.cloud.plus.v1.yifu.ekp.vo.EkpIncomeParamRisk;
import com.yifu.cloud.plus.v1.yifu.ekp.vo.EkpPushFundParam;
import com.yifu.cloud.plus.v1.yifu.ekp.vo.EkpPushSocialParam;
import com.yifu.cloud.plus.v1.yifu.social.constants.SocialConstants;
import com.yifu.cloud.plus.v1.yifu.social.entity.TForecastLibrary;
import com.yifu.cloud.plus.v1.yifu.social.entity.TIncome;
import com.yifu.cloud.plus.v1.yifu.social.entity.TPaymentInfo;
import com.yifu.cloud.plus.v1.yifu.social.entity.TSendEkpError;
import com.yifu.cloud.plus.v1.yifu.social.entity.*;
import com.yifu.cloud.plus.v1.yifu.social.mapper.TForecastLibraryMapper;
import com.yifu.cloud.plus.v1.yifu.social.mapper.TIncomeMapper;
import com.yifu.cloud.plus.v1.yifu.social.mapper.TPaymentInfoMapper;
import com.yifu.cloud.plus.v1.yifu.social.mapper.TPaymentSocialPushMapper;
import com.yifu.cloud.plus.v1.yifu.social.service.TSendEkpErrorService;
import com.yifu.cloud.plus.v1.yifu.social.vo.TPaymentInfoPushVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
* 主要执行人员档案的员工类型同步更新
......@@ -63,6 +59,9 @@ public class DoJointSocialTask {
@Autowired
private TForecastLibraryMapper forecastLibraryMapper;
@Autowired
private TPaymentSocialPushMapper socialPushMapper;
@Autowired
private RedisUtil redisUtil;
......@@ -428,12 +427,14 @@ public class DoJointSocialTask {
* @return: void
**/
@Async
public void asynchronousEkpPaymentSocial(List<TPaymentInfo> unPushInfo, Map<String, TSettleDomainSelectVo> mapSelectVo) {
public void asynchronousEkpPaymentSocial(List<TPaymentInfoPushVo> unPushInfo, Map<String, TSettleDomainSelectVo> mapSelectVo) {
log.info("推送社保实缴费用到EKP-线程开始");
TSettleDomain settleDomain;
EkpPushSocialParam socialParam;
TPaymentSocialPush a;
List<EkpPushSocialParam> paramList = new ArrayList<>();
for (TPaymentInfo library : unPushInfo) {
Map<String,String> idMap = new HashMap<>();
for (TPaymentInfoPushVo library : unPushInfo) {
try {
//获取项目信息
if (Common.isNotNull(mapSelectVo)) {
......@@ -668,9 +669,14 @@ public class DoJointSocialTask {
String body = ekpSocialUtil.sendToEKP(socialParam);
if (Common.isEmpty(body) || body.length() != 32) {
paramList.add(socialParam);
idMap.put(library.getId(), library.getIds());
}
if (Common.isNotNull(body) && body.length() == 32) {
paymentInfoMapper.updateBySocialPayment(library.getId());
paymentInfoMapper.updateBySocialPaymentList(library.getIds());
a = new TPaymentSocialPush();
a.setId(library.getId());
a.setPaymentIds(library.getIds());
socialPushMapper.insert(a);
} else {
TSendEkpError error = new TSendEkpError();
error.setCreateTime(new Date());
......@@ -701,7 +707,11 @@ public class DoJointSocialTask {
try {
String body = ekpSocialUtil.sendToEKP(s);
if (Common.isNotNull(body) && body.length() == 32) {
paymentInfoMapper.updateBySocialPayment(s.getFd_3b0afbe1f94a08());
paymentInfoMapper.updateBySocialPaymentList(idMap.get(s.getFd_3b0afbe1f94a08()));
a = new TPaymentSocialPush();
a.setId(s.getFd_3b0afbe1f94a08());
a.setPaymentIds(idMap.get(s.getFd_3b0afbe1f94a08()));
socialPushMapper.insert(a);
} else {
TSendEkpError error = new TSendEkpError();
error.setCreateTime(new Date());
......@@ -727,6 +737,7 @@ public class DoJointSocialTask {
}
}
}
idMap.clear();
log.info("推送社保实缴费用到EKP结束");
}
......@@ -1212,7 +1223,9 @@ public class DoJointSocialTask {
try {
String body = ekpSocialUtil.sendToEKP(s);
if (Common.isNotNull(body) && body.length() == 32) {
paymentInfoMapper.updateBySocialPayment(s.getFd_3b0afbe1f94a08());
TForecastLibrary library = forecastLibraryMapper.selectById(s.getFd_3b0afbe1f94a08());
library.setDataPush(CommonConstants.ONE_INT);
forecastLibraryMapper.updateById(library);
} else {
TSendEkpError error = new TSendEkpError();
error.setCreateTime(new Date());
......@@ -1417,7 +1430,9 @@ public class DoJointSocialTask {
try {
String body = ekpFundUtil.sendToEKP(s);
if (Common.isNotNull(body) && body.length() == 32) {
paymentInfoMapper.updateBySocialPayment(s.getFd_3b0afbaf10df2c());
TForecastLibrary library = forecastLibraryMapper.selectById(s.getFd_3b0afbaf10df2c());
library.setDataPush(CommonConstants.ONE_INT);
forecastLibraryMapper.updateById(library);
} else {
TSendEkpError error = new TSendEkpError();
error.setCreateTime(new Date());
......
......@@ -387,4 +387,55 @@
</where>
ORDER BY a.apply_start_date desc
</select>
<!-- 获取条数-->
<select id="getCountByEdit" resultType="java.lang.Integer">
SELECT
count(1)
FROM sys_base_set_info a
<where>
a.STATUS = 0 and a.ID != #{sysBaseSetInfo.id}
<if test="sysBaseSetInfo.baseType != null and sysBaseSetInfo.baseType.trim() != ''">
AND a.BASE_TYPE = #{sysBaseSetInfo.baseType}
</if>
<if test="sysBaseSetInfo.departId != null and sysBaseSetInfo.departId.trim() != ''">
AND a.DEPART_ID = #{sysBaseSetInfo.departId}
</if>
<if test="sysBaseSetInfo.province != null">
AND a.PROVINCE = #{sysBaseSetInfo.province}
</if>
<if test="sysBaseSetInfo.city != null">
AND a.CITY = #{sysBaseSetInfo.city}
</if>
<if test="sysBaseSetInfo.city == null">
AND a.CITY is null
</if>
<if test="sysBaseSetInfo.town != null">
AND a.TOWN = #{sysBaseSetInfo.town}
</if>
<if test="sysBaseSetInfo.town == null">
AND a.TOWN is null
</if>
<if test="sysBaseSetInfo.applyEndDate == null">
AND a.APPLY_END_DATE <![CDATA[ >= ]]> #{sysBaseSetInfo.applyStartDate}
</if>
<if test="sysBaseSetInfo.applyEndDate != null">
AND (
(apply_end_date is not null and (
(
apply_start_date <![CDATA[ <= ]]> #{sysBaseSetInfo.applyEndDate}
and apply_end_date >= #{sysBaseSetInfo.applyEndDate}
) or (
apply_start_date <![CDATA[ <= ]]> #{sysBaseSetInfo.applyStartDate}
and apply_end_date >= #{sysBaseSetInfo.applyStartDate}
) or (
apply_start_date >= #{sysBaseSetInfo.applyStartDate}
and apply_end_date <![CDATA[ <= ]]> #{sysBaseSetInfo.applyEndDate}
)
)) or (apply_end_date is null and apply_start_date <![CDATA[ <= ]]> #{sysBaseSetInfo.applyEndDate})
)
</if>
</where>
limit 1
</select>
</mapper>
......@@ -52,8 +52,10 @@
<result property="fundPayPoint" column="FUND_PAY_POINT"/>
<result property="processInstId" column="PROCESS_INST_ID"/>
<result property="auditUser" column="AUDIT_USER"/>
<result property="auditUserName" column="AUDIT_USER_NAME"/>
<result property="auditTime" column="AUDIT_TIME"/>
<result property="handleUser" column="HANDLE_USER"/>
<result property="handleUserName" column="HANDLE_USER_NAME"/>
<result property="handleTime" column="HANDLE_TIME"/>
<result property="applyUser" column="APPLY_USER"/>
<result property="applyTime" column="APPLY_TIME"/>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment