`)
@@ -211,6 +211,19 @@
}
});
+ function validatePoc() {
+ let result = false;
+ const pocDiv = $('#poc-info-component')
+ pocDiv.find('input').each(function () {
+ if ($(this).attr('required')) {
+ if (!$(this).val().trim()) {
+ result = true;
+ return false
+ }
+ }
+ })
+ return result
+ }
/*]]>*/
diff --git a/ruoyi-admin/src/main/resources/templates/project/info/edit.html b/ruoyi-admin/src/main/resources/templates/project/info/edit.html
index 91b140be..6e8ea65a 100644
--- a/ruoyi-admin/src/main/resources/templates/project/info/edit.html
+++ b/ruoyi-admin/src/main/resources/templates/project/info/edit.html
@@ -242,10 +242,9 @@
th:value="${#dates.format(projectInfo.estimatedOrderTime, 'yyyy-MM-dd')}">
@@ -403,7 +402,23 @@
displayInput.value = "";
}
}
+
+ function changePoc() {
+ let val = $('#poc').val();
+ console.log('----------------------------------')
+ console.log(val)
+ if (val==='0'){
+ $('#pocLogTab').attr('style','display:none')
+ }else{
+ $('#pocLogTab').attr('style','display:inline')
+ }
+ }
function submitHandler() {
+ let activeTabIndex=$('.layui-tab-title .layui-this').index();
+ if (activeTabIndex!==1 && $('#poc').val() ==='1' && validatePoc()){
+ $.modal.alertWarning("请完善POC记录信息");
+ return ;
+ }
if ($.validate.form()) {
$.operate.save(prefix + "/edit", $('#form-product-add').serialize());
} else {
@@ -411,11 +426,17 @@
}
}
+
+
$(function () {
let amount = [[${projectInfo.estimatedAmount}]] || ''
if (amount) {
document.getElementById('displayEstimatedAmount').value=amount.toLocaleString('en-US');
}
+ let pocVal = [[${projectInfo.poc}]];
+ if (pocVal==='0'){
+ $('#pocLogTab').attr('style','display:none')
+ }
initProductList()
$("input[name='estimatedOrderTime']").datetimepicker({
format: "yyyy-mm-dd",
@@ -573,19 +594,7 @@
}
- function addLog(data) {
- let length = $('#workLog tbody').find('tr').length
- let tr = $(`
-
-${length + 1} |
-
- |
- |
- |
-
`)
- $('#workLog tbody').append(tr)
- }
function showDetailValue(ele, canUpdate) {
diff --git a/ruoyi-admin/src/main/resources/templates/project/info/project.html b/ruoyi-admin/src/main/resources/templates/project/info/project.html
index 27de8c00..7e2383e7 100644
--- a/ruoyi-admin/src/main/resources/templates/project/info/project.html
+++ b/ruoyi-admin/src/main/resources/templates/project/info/project.html
@@ -291,7 +291,7 @@
width: 140
},
{
- field: 'updateTime',
+ field: 'lastWorkUpdateTime',
title: '更新时间',
class: 'time3',
width: 160,
@@ -380,7 +380,7 @@
function changeSort(ele, index) {
- let arr = ['estimated_orderTime', 'estimated_deliverTime', 'update_time']
+ let arr = ['estimated_orderTime', 'estimated_deliverTime', 'last_work_update_time']
$('.sortBox').find('.timeAction').removeClass('timeAction')
$(ele).addClass('timeAction')
$('input[name="orderByColumn"]').val(arr[index])
@@ -397,8 +397,10 @@
$('#laydate-startTime').attr('name', 'estimatedDeliverTimeStart')
$('#laydate-endTime').attr('name', 'estimatedDeliverTimeEnd')
} else if (timeType == 2) {
- $('#laydate-startTime').attr('name', 'updateTimeStart')
- $('#laydate-endTime').attr('name', 'updateTimeEnd')
+ // $('#laydate-startTime').attr('name', 'updateTimeStart')
+ // $('#laydate-endTime').attr('name', 'updateTimeEnd')
+ $('#laydate-startTime').attr('name', 'lastWorkUpdateTimeStart')
+ $('#laydate-endTime').attr('name', 'lastWorkUpdateTimeEnd')
}
}
diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/ProjectInfo.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/ProjectInfo.java
index c42dbca4..d3f99359 100644
--- a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/ProjectInfo.java
+++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/ProjectInfo.java
@@ -108,6 +108,7 @@ public class ProjectInfo extends BaseEntity
private Date estimatedOrderTimeStart;
private Date estimatedOrderTimeEnd;
+
@Excel(name = "POC测试")
private String poc;
private String contactEmail;
@@ -158,11 +159,13 @@ public class ProjectInfo extends BaseEntity
private Date estimatedDeliverTimeEnd;
private Date updateTimeStart;
private Date updateTimeEnd;
+
+ private Date updateTime;
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@Excel(name = "更新时间", width = 30, dateFormat = "yyyy-MM-dd")
- private Date updateTime;
-
-
+ private Date lastWorkUpdateTime;
+ private Date lastWorkUpdateTimeStart;
+ private Date lastWorkUpdateTimeEnd;
diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/DeliveryListServiceImpl.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/DeliveryListServiceImpl.java
index f3711c40..45ca5f75 100644
--- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/DeliveryListServiceImpl.java
+++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/DeliveryListServiceImpl.java
@@ -210,8 +210,8 @@ public class DeliveryListServiceImpl implements IDeliveryListService {
private void updateDeliveryInfoVo(DeliveryInfoVo deliveryInfoVo, Map
> maintenanceTypeMap, List productInfos) {
List productInfoList = maintenanceTypeMap.get(deliveryInfoVo.getOrderId());
List serviceInfoList = new ArrayList<>();
+ Date startTime = deliveryInfoVo.getServiceStartTime();
if (CollUtil.isNotEmpty(productInfoList)) {
- Date startTime = deliveryInfoVo.getServiceStartTime();
if (ProductInfo.ProductTypeEnum.SOFTWARE.getType().equals(deliveryInfoVo.getProductType())) {
for (ProductInfo productInfo : productInfoList) {
if (ProductInfo.ProductTypeEnum.SOFTWARE_MAINTENANCE.getType().equals(productInfo.getType()) && StringUtils.isNotEmpty(productInfo.getValue())) {
@@ -228,6 +228,7 @@ public class DeliveryListServiceImpl implements IDeliveryListService {
}
}
}
+ }
if (CollUtil.isEmpty(serviceInfoList) && ProductInfo.ProductTypeEnum.HARDWARE.getType().equals(deliveryInfoVo.getProductType())
&& CollUtil.isNotEmpty(productInfos)) {
@@ -238,7 +239,7 @@ public class DeliveryListServiceImpl implements IDeliveryListService {
}
deliveryInfoVo.setServiceInfo(serviceInfoList);
- }
+
}
private static Date updateStartTimeAndAddList(DeliveryInfoVo deliveryInfoVo, ProductInfo productInfo, Date startTime, List serviceInfoList) {
diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OrderInfoServiceImpl.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OrderInfoServiceImpl.java
index 37abd601..a2e9287b 100644
--- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OrderInfoServiceImpl.java
+++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OrderInfoServiceImpl.java
@@ -349,7 +349,7 @@ public class OrderInfoServiceImpl implements IOrderInfoService
if (orderList.getDiscount() == null) {
throw new ServiceException("折扣不能为空");
}
- if (orderList.getDiscount().compareTo(BigDecimal.ONE) > 0 || orderList.getDiscount().compareTo(BigDecimal.ZERO) <= 0) {
+ if (orderList.getDiscount().compareTo(BigDecimal.ONE) > 0 || orderList.getDiscount().compareTo(BigDecimal.ZERO) < 0) {
throw new ServiceException("折扣区间需在0-1之间");
}
if (orderList.getPrice() == null) {
diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/ProjectInfoServiceImpl.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/ProjectInfoServiceImpl.java
index 22b2b27b..72aabd8c 100644
--- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/ProjectInfoServiceImpl.java
+++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/ProjectInfoServiceImpl.java
@@ -18,6 +18,8 @@ import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.sip.domain.*;
+import com.ruoyi.sip.dto.HomepageQueryDto;
+import com.ruoyi.sip.dto.StatisticsDto;
import com.ruoyi.sip.mapper.ProjectInfoMapper;
import com.ruoyi.sip.service.*;
import lombok.extern.slf4j.Slf4j;
@@ -129,10 +131,16 @@ public class ProjectInfoServiceImpl implements IProjectInfoService {
Map orderInfoMap = projectOrderInfos.stream().collect(Collectors.toMap(ProjectOrderInfo::getProjectId, Function.identity(), (v1, v2) -> v1));
LocalDate now = LocalDate.now();
for (ProjectInfo info : projectInfos) {
- LocalDate localDate = info.getUpdateTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
- Period between = Period.between(localDate, now);
- info.setHighlight(between.getMonths() >= 2);
info.setCanGenerate(orderInfoMap.get(info.getId()) == null);
+ if (info.getLastWorkUpdateTime() != null) {
+ LocalDate localDate = info.getLastWorkUpdateTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+ Period between = Period.between(localDate, now);
+ info.setHighlight(between.getMonths() >= 2);
+ } else {
+ info.setHighlight(false);
+ }
+
+
}
return projectInfos;
}
@@ -153,9 +161,6 @@ public class ProjectInfoServiceImpl implements IProjectInfoService {
if (CollUtil.isNotEmpty(projectInfo.getCompetitorList())) {
projectInfo.setCompetitor(projectInfo.getCompetitorList().stream().filter(StringUtils::isNotEmpty).collect(Collectors.joining(",")));
}
- if (projectInfo.getProjectPocInfo()!=null && CollUtil.isNotEmpty(projectInfo.getProjectPocInfo().getProjectPocInfoDetailList())){
- projectInfo.setPoc("1");
- }
int i = projectInfoMapper.insertProjectInfo(projectInfo);
saveOtherInfo(projectInfo);
return i;
@@ -229,18 +234,9 @@ public class ProjectInfoServiceImpl implements IProjectInfoService {
//如果没有 变更编码 是否考虑高并发加锁
setProjectCode(projectInfo);
}
-
-
- int newWorkSize = projectInfo.getProjectWorkProgressList() == null ? 0 : projectInfo.getProjectWorkProgressList().size();
- int existWorkSize = oldProjectInfo.getProjectWorkProgressList() == null ? 0 : oldProjectInfo.getProjectWorkProgressList().size();
- boolean changeWork = newWorkSize > existWorkSize;
// 更新项目信息
- if (changeWork) {
- projectInfo.setUpdateTime(DateUtils.getNowDate());
- }
- if (projectInfo.getProjectPocInfo()!=null && CollUtil.isNotEmpty(projectInfo.getProjectPocInfo().getProjectPocInfoDetailList())){
- projectInfo.setPoc("1");
- }
+ projectInfo.setUpdateTime(DateUtils.getNowDate());
+ projectInfo.setUpdateBy(ShiroUtils.getUserId().toString());
int result = projectInfoMapper.updateProjectInfo(projectInfo);
//变更其它信息
saveOtherInfo(projectInfo);
@@ -284,6 +280,7 @@ public class ProjectInfoServiceImpl implements IProjectInfoService {
formatterDate(projectInfo.getEstimatedOrderTime()));
// logIndex = compareField(logContent, logIndex, "预计发货时间", formatterDate(oldProjectInfo.getEstimatedDeliverTime()), formatterDate(projectInfo.getEstimatedDeliverTime()));
logIndex = compareField(logContent, logIndex, "竞争对手", oldProjectInfo.getCompetitor(), projectInfo.getCompetitor());
+ logIndex = compareField(logContent, logIndex, "poc记录", oldProjectInfo.getPoc(), projectInfo.getPoc());
logIndex = compareField(logContent, logIndex, "关键技术问题", oldProjectInfo.getKeyProblem(), projectInfo.getKeyProblem());
logIndex = compareField(logContent, logIndex, "项目简述", oldProjectInfo.getProjectDesc(), projectInfo.getProjectDesc());
if (logIndex > 1) {
diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/ProjectOrderInfoServiceImpl.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/ProjectOrderInfoServiceImpl.java
index 1f5c1e1b..77470677 100644
--- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/ProjectOrderInfoServiceImpl.java
+++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/ProjectOrderInfoServiceImpl.java
@@ -327,7 +327,7 @@ public class ProjectOrderInfoServiceImpl implements IProjectOrderInfoService {
Sheet sheet = writeSheetHolder.getSheet();
// 基础列范围(前 25 列)
- if (columnIndex >= 0 && columnIndex <= 25) {
+ if (columnIndex >= 0 && columnIndex <= 26) {
// 自适应列宽逻辑
sheet.setColumnWidth(columnIndex, 256 * 30); // 设置固定宽度为 20 个字符
}
diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/ProjectProductInfoServiceImpl.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/ProjectProductInfoServiceImpl.java
index f65bb6a3..dccafb9f 100644
--- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/ProjectProductInfoServiceImpl.java
+++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/ProjectProductInfoServiceImpl.java
@@ -1,5 +1,7 @@
package com.ruoyi.sip.service.impl;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
import java.util.Collections;
import java.util.List;
import java.util.Set;
@@ -117,7 +119,18 @@ public class ProjectProductInfoServiceImpl implements IProjectProductInfoService
if (stringJoiner.length() > 0) {
throw new ServiceException(StringUtils.format("产品编码[{}]在产品库中未找到,请确认后重试", stringJoiner.toString()));
}
-
+ for (ProjectProductInfo info : list) {
+ //计算价格 防止前端价格计算错误
+ if (info.getGuidanceDiscount() != null && info.getDiscount() == null) {
+ info.setDiscount(info.getGuidanceDiscount());
+ }
+ if (info.getCataloguePrice() != null && info.getDiscount() != null) {
+ info.setPrice(info.getCataloguePrice().multiply(info.getDiscount()).setScale(2, RoundingMode.HALF_UP));
+ }
+ if (info.getPrice() != null && info.getQuantity() != null) {
+ info.setAllPrice(info.getPrice().multiply(new BigDecimal(info.getQuantity())).setScale(2, RoundingMode.HALF_UP));
+ }
+ }
List projectProductInfos = projectProductInfoMapper.selectProjectProductInfoListByProjectId(Collections.singletonList(list.get(0).getProjectId()));
Set idSet = list.stream().map(ProjectProductInfo::getId).collect(Collectors.toSet());
diff --git a/ruoyi-sip/src/main/resources/mapper/sip/ProjectInfoMapper.xml b/ruoyi-sip/src/main/resources/mapper/sip/ProjectInfoMapper.xml
index 9172c52e..a4edd75b 100644
--- a/ruoyi-sip/src/main/resources/mapper/sip/ProjectInfoMapper.xml
+++ b/ruoyi-sip/src/main/resources/mapper/sip/ProjectInfoMapper.xml
@@ -70,10 +70,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
t1.update_time,
t1.customer_user_name,t1.customer_phone,t1.partner_email,t1.partner_user_name,t1.h3c_person,t1.poc,t1.h3c_phone,
t2.agent_name,t2.contact_email,t2.contact_phone,t2.contact_person,
- t3.user_name as hz_support_user_name
+ t3.user_name as hz_support_user_name,
+ t4.work_time as last_work_update_time
from project_info t1
left join agent_info t2 on t1.agent_code = t2.agent_code
left join sys_user t3 on t1.hz_support_user=t3.user_id
+ left join (select max(work_time) work_time,project_id from project_work_progress group by project_id) t4 ON t1.id=t4.project_id
+