Browse Source

2023-12-25 询价修改 报价流程

master
zelian_wu 3 years ago
parent
commit
a8cbd44d8b
  1. 11
      src/main/java/com/spring/modules/quotation/entity/QuotationInformationEntity.java
  2. 58
      src/main/java/com/spring/modules/quotation/entity/SeqRule.java
  3. 9
      src/main/java/com/spring/modules/quotation/mapper/SeqRuleMapper.java
  4. 14
      src/main/java/com/spring/modules/quotation/service/SeqRuleService.java
  5. 110
      src/main/java/com/spring/modules/quotation/service/impl/QuotationHeaderServerImpl.java
  6. 31
      src/main/java/com/spring/modules/quotation/service/impl/QuotationInformationServiceImpl.java
  7. 52
      src/main/java/com/spring/modules/quotation/service/impl/SeqRuleServiceImpl.java
  8. 18
      src/main/resources/mapper/quotation/QuotationInformationMapper.xml

11
src/main/java/com/spring/modules/quotation/entity/QuotationInformationEntity.java

@ -1,6 +1,7 @@
package com.spring.modules.quotation.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.FieldStrategy;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
@ -133,7 +134,7 @@ public class QuotationInformationEntity extends QueryPage implements Serializabl
/**
* 更新时间
**/
@TableField(fill = FieldFill.UPDATE)
@TableField(fill = FieldFill.UPDATE,insertStrategy = FieldStrategy.NEVER)
private Date updateDate;
/**
* 更新人
@ -148,5 +149,13 @@ public class QuotationInformationEntity extends QueryPage implements Serializabl
*/
@TableField(exist = false)
private List<QuotationInformationEntity> informationList;
/**
* 批次号
*/
private String quotationBatchNo;
/**
* 批次序号
*/
private Integer quotationItemNo;
}

58
src/main/java/com/spring/modules/quotation/entity/SeqRule.java

@ -0,0 +1,58 @@
package com.spring.modules.quotation.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
@Data
@TableName("seq_rule")
public class SeqRule {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private String type;
private String name;
private String prefix;
private Integer length;
private Long currentVal;
private Date createDate;
private String createBy;
private Date updateDate;
private String updateBy;
private String site;
public SeqRule(){}
/**
* 构造函数
* @param site 工厂编号
* @param type 类型 XJ/BJ...
* @param name 中文类型描述
* @param prefix 前缀
* @param length 序列长度
*/
public SeqRule(String site,String type,String name,String prefix,Integer length){
this.site= site;
this.type = type;
this.name = name;
this.prefix = prefix;
this.length = length;
}
/**
* 构造函数
* @param site 工厂编号
* @param type 类型 XJ/BJ...
* @param name 中文类型描述
* @param prefix 前缀
* @param length 序列长度
* @param currentVal 序列初始值
*/
public SeqRule(String site,String type,String name,String prefix,Integer length,Long currentVal){
this(site,type,name,prefix,length);
this.currentVal = currentVal;
}
}

9
src/main/java/com/spring/modules/quotation/mapper/SeqRuleMapper.java

@ -0,0 +1,9 @@
package com.spring.modules.quotation.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.spring.modules.quotation.entity.SeqRule;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SeqRuleMapper extends BaseMapper<SeqRule> {
}

14
src/main/java/com/spring/modules/quotation/service/SeqRuleService.java

@ -0,0 +1,14 @@
package com.spring.modules.quotation.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.spring.modules.quotation.entity.SeqRule;
public interface SeqRuleService extends IService<SeqRule> {
/**
* 获取序列号
* @param type 类型
* @param prefix 前缀
* @return
*/
String getSeqNo(String site,String type,String prefix);
}

110
src/main/java/com/spring/modules/quotation/service/impl/QuotationHeaderServerImpl.java

@ -9,21 +9,25 @@ import com.spring.common.utils.R;
import com.spring.modules.quotation.entity.QuotationDetail;
import com.spring.modules.quotation.entity.QuotationHeader;
import com.spring.modules.quotation.entity.QuotationInformationEntity;
import com.spring.modules.quotation.entity.SeqRule;
import com.spring.modules.quotation.mapper.QuotationHeaderMapper;
import com.spring.modules.quotation.service.QuotationDetailService;
import com.spring.modules.quotation.service.QuotationHeaderServer;
import com.spring.modules.quotation.service.QuotationInformationService;
import com.spring.modules.quotation.service.SeqRuleService;
import com.spring.modules.quotation.vo.QuotationHeaderVo;
import com.spring.modules.quotation.vo.QuotationInformationVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
@ -32,6 +36,10 @@ public class QuotationHeaderServerImpl extends ServiceImpl<QuotationHeaderMapper
@Autowired
private QuotationDetailService quotationDetailService;
@Autowired
private SeqRuleService seqRuleService;
@Autowired
private QuotationInformationService quotationInformationService;
@Override
public R getQuotationHeaderByPage(Integer no, Integer size,String site,String customerNo,String customerName,
@ -51,12 +59,34 @@ public class QuotationHeaderServerImpl extends ServiceImpl<QuotationHeaderMapper
@Override
@Transactional
public R insertQuotationHeader(QuotationHeader quotationHeader) {
String quotationHeaderNo = this.baseMapper.getQuotationNo(quotationHeader.getSite());
quotationHeader.setQuotationNo("QBJ"+quotationHeaderNo.toUpperCase());
String quotationHeaderNo = "BJ"+this.baseMapper.getQuotationNo(quotationHeader.getSite());
quotationHeader.setQuotationNo(quotationHeaderNo.toUpperCase());
quotationHeader.setVersionCode("A"+quotationHeader.getVersionCode().toUpperCase());
quotationHeader.setCustomerInquiryNo(quotationHeader.getCustomerInquiryNo().toUpperCase());
quotationHeader.setInternalInquiryNo(quotationHeader.getInternalInquiryNo().toUpperCase());;
if (!StringUtils.hasText(quotationHeader.getInternalInquiryNo())){
boolean saveFlag = save(quotationHeader);
if (saveFlag){
return R.ok("保存成功").put("code",200);
}
return R.error("保存失败").put("code",500);
}
QuotationInformationVo informationVo = quotationInformationService.searchQuotationByQuotationNo(quotationHeader.getSite(), quotationHeader.getInternalInquiryNo()).get(0);
quotationHeader.setInternalInquiryNo(informationVo.getQuotationBatchNo().toUpperCase());;
boolean saveFlag = save(quotationHeader);
QuotationDetail detail = new QuotationDetail();
detail.setProductNo(informationVo.getTestPartNo());
detail.setProductDesc(informationVo.getPartName());
detail.setQuotationDetailQuantity(new BigDecimal("1"));
// 绑定主键
detail.setSite(informationVo.getSite());
detail.setQuotationDetailStatus("草稿");
detail.setInternalInquiryNo(informationVo.getQuotationNo().toUpperCase());
detail.setQuotationHeaderId(quotationHeader.getQuotationHeaderId());
detail.setRemark("");
// 新增询价
quotationDetailService.save(detail);
// 新增序列规则记录
seqRuleService.save(new SeqRule(quotationHeader.getSite(),"BJ","报价单号",quotationHeaderNo,3));
if (saveFlag){
return R.ok("保存成功").put("code",200);
}
@ -66,6 +96,7 @@ public class QuotationHeaderServerImpl extends ServiceImpl<QuotationHeaderMapper
@Override
@Transactional
public R updateQuotationHeader(QuotationHeader quotationHeader) {
quotationHeader.setInternalInquiryNo(quotationHeader.getInternalInquiryNo().split("-")[0]);
return updateById(quotationHeader) ? R.ok("保存成功").put("code",200) : R.error("保存失败");
}
@ -83,52 +114,55 @@ public class QuotationHeaderServerImpl extends ServiceImpl<QuotationHeaderMapper
@Override
@Transactional
public R saveBatchQuotationHeader(List<QuotationInformationVo> quotationInformationVoList) {
List<QuotationHeader> quotationHeaderList = new ArrayList<>();
try{
for (int i = 0; i < quotationInformationVoList.size(); i++) {
// 获得询价对象
QuotationInformationVo information = quotationInformationVoList.get(i);
// 获取主键
String quotationHeaderNo = this.baseMapper.getQuotationNo(information.getSite());
// 创建报价对象
QuotationHeader quotationHeader = new QuotationHeader();
quotationHeader.setSite(information.getSite());
quotationHeader.setQuotationNo("QBJ"+quotationHeaderNo.toUpperCase());
quotationHeader.setQuotationDate(new Date());
quotationHeader.setCustomerNo(information.getCustomerNo());
quotationHeader.setVersionCode("A001");
quotationHeader.setProjectId(information.getProjectId());
quotationHeader.setTracker(information.getTracker());
quotationHeader.setCurrency(information.getCustomerCurrency());
quotationHeader.setQuotationStatus("草稿");
quotationHeader.setRemark("");
quotationHeader.setCustomerInquiryNo("");
quotationHeader.setInternalInquiryNo(information.getQuotationNo().toUpperCase());
quotationHeader.setRequireApproval("");
quotationHeader.setApprovalStatus("");
quotationHeader.setCreateBy(Integer.valueOf(information.getCreateBy()));
quotationHeader.setCreateTime(new Date());
// 新增报价
save(quotationHeader);
quotationHeaderList.add(quotationHeader);
Map<String, List<QuotationInformationVo>> listMap = quotationInformationVoList.stream().collect(Collectors.groupingBy(QuotationInformationVo::getQuotationBatchNo));
List<Integer> ids = new ArrayList<>();
for (String key : listMap.keySet()) {
List<QuotationInformationVo> list = listMap.get(key);
// 获得询价对象
QuotationInformationVo information = quotationInformationVoList.get(0);
// 获取主键
String quotationHeaderNo = "BJ"+this.baseMapper.getQuotationNo(information.getSite()).toUpperCase();
// 创建报价对象
QuotationHeader quotationHeader = new QuotationHeader();
quotationHeader.setSite(information.getSite());
quotationHeader.setQuotationNo(quotationHeaderNo.toUpperCase());
quotationHeader.setQuotationDate(new Date());
quotationHeader.setCustomerNo(information.getCustomerNo());
quotationHeader.setVersionCode("A001");
quotationHeader.setProjectId(information.getProjectId());
quotationHeader.setTracker(information.getTracker());
quotationHeader.setQuoter(information.getQuoter());
quotationHeader.setCurrency(information.getCustomerCurrency());
quotationHeader.setQuotationStatus("草稿");
quotationHeader.setRemark("");
quotationHeader.setCustomerInquiryNo("");
quotationHeader.setInternalInquiryNo(information.getQuotationBatchNo().toUpperCase());
quotationHeader.setRequireApproval("");
quotationHeader.setApprovalStatus("");
quotationHeader.setCreateBy(Integer.valueOf(information.getCreateBy()));
quotationHeader.setCreateTime(new Date());
// 新增报价
save(quotationHeader);
ids.add(quotationHeader.getQuotationHeaderId());
// 新增序列规则记录
seqRuleService.save(new SeqRule(information.getSite(),"BJ","报价单号",quotationHeaderNo,3));
for (int i = 0; i < list.size(); i++) {
QuotationInformationVo quotationInformationVo = list.get(i);
// 创建询价对象
QuotationDetail detail = new QuotationDetail();
detail.setProductNo(information.getTestPartNo());
detail.setProductDesc(information.getPartName());
detail.setProductNo(quotationInformationVo.getTestPartNo());
detail.setProductDesc(quotationInformationVo.getPartName());
detail.setQuotationDetailQuantity(new BigDecimal("1"));
// 绑定主键
detail.setSite(information.getSite());
detail.setSite(quotationInformationVo.getSite());
detail.setQuotationDetailStatus("草稿");
detail.setInternalInquiryNo(information.getQuotationNo().toUpperCase());
detail.setInternalInquiryNo(quotationInformationVo.getQuotationNo().toUpperCase());
detail.setQuotationHeaderId(quotationHeader.getQuotationHeaderId());
detail.setRemark("");
// 新增询价
quotationDetailService.save(detail);
}
}catch (Exception e){
throw new RuntimeException("保存异常,异常信息:"+e.getMessage());
}
List<Integer> ids = quotationHeaderList.stream().map(QuotationHeader::getQuotationHeaderId).collect(Collectors.toList());
return R.ok("保存成功").put("data",ids).put("code",200);
}
}

31
src/main/java/com/spring/modules/quotation/service/impl/QuotationInformationServiceImpl.java

@ -17,8 +17,10 @@ import com.spring.modules.oss.service.SysOssService;
import com.spring.modules.project.data.PlmProjectInfoData;
import com.spring.modules.project.data.PlmProjectPartData;
import com.spring.modules.quotation.entity.QuotationInformationEntity;
import com.spring.modules.quotation.entity.SeqRule;
import com.spring.modules.quotation.mapper.QuotationInformationMapper;
import com.spring.modules.quotation.service.QuotationInformationService;
import com.spring.modules.quotation.service.SeqRuleService;
import com.spring.modules.quotation.vo.QuotationInformationVo;
import com.spring.modules.quotation.vo.SysOssVo;
import com.spring.modules.sys.entity.GetParamInData;
@ -28,6 +30,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletOutputStream;
@ -50,6 +53,9 @@ public class QuotationInformationServiceImpl extends ServiceImpl<QuotationInform
@Autowired
private SysOssDao sysOssDao;
@Autowired
private SeqRuleService seqRuleService;
@Value("${sys-file.file-path}")
private String filePath;
@ -62,6 +68,9 @@ public class QuotationInformationServiceImpl extends ServiceImpl<QuotationInform
**/
@Override
public PageUtils quotationInformationSearch(QuotationInformationVo data) {
if (StringUtils.hasText(data.getQuotationBatchNo())){
data.setQuotationBatchNo(data.getQuotationBatchNo().toUpperCase());
}
IPage<QuotationInformationVo> resultList = this.quotationInformationMapper.quotationInformationSearch(new Page<QuotationInformationVo>(data.getPage(), data.getLimit()), data);
return new PageUtils(resultList);
}
@ -76,13 +85,31 @@ public class QuotationInformationServiceImpl extends ServiceImpl<QuotationInform
@Override
@Transactional
public void quotationInformationSave(QuotationInformationEntity data) {
// 报价主单号
String quotationNo ="XJ"+quotationInformationMapper.getQuotationNo(data);
// 创建序列规则
SeqRule seqRule = seqRuleService.lambdaQuery().eq(SeqRule::getSite, data.getSite()).eq(SeqRule::getType, "XJ").eq(SeqRule::getPrefix, quotationNo).one();
if (seqRule != null) {
seqRule.setCurrentVal(1L);
if (!seqRuleService.updateById(seqRule)) {
throw new RuntimeException("序列号修改失败!");
}
}else {
if (!seqRuleService.save(new SeqRule(data.getSite(),"XJ","询价单号",quotationNo,3))) {
throw new RuntimeException("新增询价规则异常");
}
}
// 获取项目料号
String[] testPartNoList = data.getTestPartNo().split(";");
// 新增
for (String testPartNo : testPartNoList) {
// 获取序列号
String seqNo = seqRuleService.getSeqNo(data.getSite(),"XJ", quotationNo);
String[] seqNoStr = seqNo.split("-");
// 获取报价单号
String quotationNo = quotationInformationMapper.getQuotationNo(data);
data.setQuotationNo("BJ" + quotationNo);
data.setQuotationNo(seqNo);
data.setQuotationBatchNo(quotationNo);
data.setQuotationItemNo(Integer.valueOf(seqNoStr[1]));
data.setTestPartNo(testPartNo);
data.setQuotationResultStatus(data.getQuotationResultStatus());
quotationInformationMapper.insert(data);

52
src/main/java/com/spring/modules/quotation/service/impl/SeqRuleServiceImpl.java

@ -0,0 +1,52 @@
package com.spring.modules.quotation.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.spring.modules.quotation.entity.SeqRule;
import com.spring.modules.quotation.mapper.SeqRuleMapper;
import com.spring.modules.quotation.service.SeqRuleService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@Slf4j
public class SeqRuleServiceImpl extends ServiceImpl<SeqRuleMapper, SeqRule> implements SeqRuleService {
@Override
@Transactional
public String getSeqNo(String site,String type, String prefix) {
SeqRule seqRule = lambdaQuery().eq(SeqRule::getSite,site).eq(SeqRule::getType, type).eq(SeqRule::getPrefix, prefix).one();
String seqNo = seqRuleValue(seqRule);
//生成完成直接递增
seqRule.setCurrentVal(seqRule.getCurrentVal()+1);
if (!updateById(seqRule)) {
throw new RuntimeException("序列号修改失败!");
}
return seqNo;
}
/**
* 通过序列号规则获取序列号
* @param seqRule 序列号规则
* @return
*/
public String seqRuleValue(SeqRule seqRule){
if (seqRule == null){
throw new RuntimeException("序列号规则未定义");
}
String prefix = seqRule.getPrefix();
return prefix+"-"+getSeqNumber(seqRule.getCurrentVal(),seqRule.getLength());
}
/**
* 返回组装的序列
* @param currentVal 当前序列值
* @param length 序列长度
* @return
*/
public String getSeqNumber(Long currentVal,Integer length){
return StringUtils.leftPad(currentVal.toString(),length,"0");
}
}

18
src/main/resources/mapper/quotation/QuotationInformationMapper.xml

@ -39,13 +39,21 @@
confirm_results,
confirm_by,
confirm_information,
quotation_result_status
quotation_result_status,
quotation_batch_no,
quotation_item_no
FROM plm_quotation_information
<where>
site = #{query.site}
<if test="query.quotationNo != null and query.quotationNo != ''">
AND quotation_no = #{query.quotationNo}
</if>
<if test="query.quotationBatchNo != null and query.quotationBatchNo != ''">
AND quotation_batch_no like #{query.quotationBatchNo}
</if>
<if test="query.quotationItemNo != null and query.quotationItemNo != ''">
AND quotation_item_no = #{query.quotationItemNo}
</if>
<if test = "query.customerNo != null and query.customerNo != ''">
AND customer_no like #{query.customerNo}
</if>
@ -82,7 +90,7 @@
<if test="query.endDate != null ">
AND #{query.endDate} >= required_completion_date
</if>
order by create_date desc
order by quotation_batch_no desc,quotation_item_no
</where>
</select>
@ -125,7 +133,7 @@
<!-- 获得报价单号 -->
<select id="getQuotationNo" resultType="string" parameterType="QuotationInformationEntity">
SELECT
Right('0000000000' + convert(VARCHAR(10), isnull(max(convert(INT, SUBSTRING(quotation_no, 3, 10))), 0) + 1), 8)
Right('0000000000' + convert(VARCHAR(10), isnull(max(convert(INT, SUBSTRING(quotation_batch_no, 3, 10))), 0) + 1), 8)
FROM plm_quotation_information
WHERE site = #{site}
</select>
@ -269,7 +277,9 @@
confirm_results,
confirm_by,
confirm_information,
quotation_result_status
quotation_result_status,
quotation_batch_no,
quotation_item_no
FROM plm_quotation_information
<where>
site = #{site}

Loading…
Cancel
Save