付款进度代码同步

This commit is contained in:
2025-06-07 15:15:55 +08:00
parent d5660ee8aa
commit ce5e217c0c
21 changed files with 515 additions and 99 deletions

View File

@@ -6,11 +6,15 @@ import java.util.Arrays;
import com.baomidou.dynamic.datasource.annotation.DSTransactional;
import com.ruoyi.oa.domain.bo.SysOaWarehouseDetailBo;
import com.ruoyi.oa.domain.vo.DashboardChartsVo;
import com.ruoyi.oa.domain.vo.DashboardMetricsVo;
import com.ruoyi.oa.domain.vo.SysOaOutWarehouseListVo;
import com.ruoyi.oa.mapper.SysOaTaskMapper;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import com.ruoyi.common.annotation.RepeatSubmit;
@@ -164,4 +168,56 @@ public class SysOaProjectController extends BaseController {
}
/**
* 数据报表部分
*/
/**
* GET /api/projects/foreign/dashboard/metrics
* @param start yyyy/MM/dd
* @param end yyyy/MM/dd
*/
@GetMapping("/metrics")
public R<DashboardMetricsVo> metrics(
@RequestParam @DateTimeFormat(pattern = "yyyy/MM/dd") Date start,
@RequestParam @DateTimeFormat(pattern = "yyyy/MM/dd") Date end,
@RequestParam(value="tradeType" , required = false) Long tradeType
) {
DashboardMetricsVo vo = iSysOaProjectService.getMetrics(start, end,tradeType);
return R.ok(vo);
}
/**
* GET /api/projects/foreign/dashboard/charts
* @param start yyyy/MM/dd
* @param end yyyy/MM/dd
*/
@GetMapping("/charts")
public R<DashboardChartsVo> charts(
@RequestParam @DateTimeFormat(pattern = "yyyy/MM/dd") Date start,
@RequestParam @DateTimeFormat(pattern = "yyyy/MM/dd") Date end,
@RequestParam(value="tradeType" , required = false) Long tradeType
) {
DashboardChartsVo vo = iSysOaProjectService.getCharts(start, end,tradeType);
return R.ok(vo);
}
/**
* GET /api/projects/foreign/expiring
* @param days 预警天数,默认 7
*/
@GetMapping("/expiring")
public R<List<SysOaProjectVo>> expiring(
@RequestParam(name = "days", defaultValue = "7") Integer days,
@RequestParam(value="tradeType" , required = false) Long tradeType
) {
List<SysOaProjectVo> list = iSysOaProjectService.getExpiringForeignProjects(days,tradeType);
return R.ok(list);
}
}

View File

@@ -133,7 +133,7 @@ public class SysOaWarehouseTaskController extends BaseController {
/**
* 处理单个物料入库
* 处理批量物料入库
*/
@RepeatSubmit()
@PutMapping("/status-list")

View File

@@ -79,4 +79,6 @@ public class SysOaWarehouseTask extends BaseEntity {
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date endTime;
private String unit;
}

View File

@@ -181,5 +181,7 @@ public class SysOaProjectBo extends BaseEntity {
* 代号类型
*/
private String projectCode;
private String status;
}

View File

@@ -84,4 +84,9 @@ public class SysOaWarehouseTaskBo extends BaseEntity {
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date endTime;
/**
* 单位
*/
private String unit;
}

View File

@@ -0,0 +1,14 @@
package com.ruoyi.oa.domain.vo;
import lombok.Data;
import java.util.List;
@Data
public class DashboardChartsVo {
private List<TrendPointVo> contractAmountTrend; // 折线图
private List<StatusCountVo> projectStatusDistribution; // 饼图
private List<TrendPointVo> monthlyContractComparison; // 柱状图
}

View File

@@ -0,0 +1,24 @@
package com.ruoyi.oa.domain.vo;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class DashboardMetricsVo {
// 本月合同总额
private BigDecimal totalFunds;
// 合同数量统计
private Integer contractCount;
// 临期项目数量
private Integer expiringCount;
// 月度目标完成率0-100
private BigDecimal completionRate;
private BigDecimal growthFunds;
private BigDecimal growthCount;
private BigDecimal growthExpiring;
}

View File

@@ -99,6 +99,12 @@ public class OaProgressVo {
*/
private String contactPhone;
/**
* 父项目电话
*/
private String parentPhone;
private String nowDepart;
// 新增统计字段
private Long progressSize;
private Long finishCount;

View File

@@ -0,0 +1,10 @@
package com.ruoyi.oa.domain.vo;
import lombok.Data;
@Data
public class StatusCountVo {
private String status; // "正常"/"进行中"/"即将到期"/"已逾期"
private Integer count;
}

View File

@@ -246,4 +246,9 @@ public class SysOaProjectVo {
*/
private String projectCode;
/**
* 项目状态
*/
private String status;
}

View File

@@ -86,4 +86,9 @@ public class SysOaWarehouseTaskVo {
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date endTime;
/**
* 单位
*/
private String unit;
}

View File

@@ -0,0 +1,12 @@
package com.ruoyi.oa.domain.vo;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class TrendPointVo {
private String month; // 如 "1月"
private BigDecimal value; // 金额或数量
}

View File

@@ -7,12 +7,11 @@ import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.oa.domain.SysOaProject;
import com.ruoyi.oa.domain.bo.SysOaProjectBo;
import com.ruoyi.oa.domain.vo.SysOaCostAllVo;
import com.ruoyi.oa.domain.vo.SysOaOutWarehouseListVo;
import com.ruoyi.oa.domain.vo.SysOaProjectVo;
import com.ruoyi.oa.domain.vo.*;
import com.ruoyi.common.core.mapper.BaseMapperPlus;
import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
@@ -57,4 +56,33 @@ public interface SysOaProjectMapper extends BaseMapperPlus<SysOaProjectMapper, S
SysOaProjectVo selectVoByIdPlus(Long projectId);
/** 本月合同总额 */
BigDecimal selectTotalFunds(@Param("start") Date start,
@Param("end") Date end, @Param("tradeType") Long tradeType);
/** 本月合同数量 */
Integer selectContractCount(@Param("start") Date start,
@Param("end") Date end, @Param("tradeType") Long tradeType);
/** 临期项目数量(到期日在 start~end 之间) */
Integer selectExpiringCount(@Param("start") Date start,
@Param("end") Date end, @Param("tradeType") Long tradeType);
List<TrendPointVo> selectContractAmountTrend(@Param("start") Date start,
@Param("end") Date end, @Param("tradeType") Long tradeType);
/** 项目状态分布(示例按 finish_time 与 project_status 简单分类) */
List<StatusCountVo> selectProjectStatusDistribution(@Param("tradeType") Long tradeType);
/** 月度合同数量对比 */
List<TrendPointVo> selectMonthlyContractComparison(@Param("start") Date start,
@Param("end") Date end, @Param("tradeType") Long tradeType);
List<SysOaProjectVo> selectExpiringForeignProjects(@Param("now") Date now, @Param("expireDays") Integer expireDays, @Param("tradeType") Long tradeType);
BigDecimal selectPrevAvgTotalFunds(@Param("start") Date start, @Param("end") Date end, @Param("tradeType") Long tradeType);
BigDecimal selectPrevAvgContractCount(@Param("start") Date start, @Param("end") Date end, @Param("tradeType") Long tradeType);
BigDecimal selectPrevAvgExpiringCount(@Param("start") Date start, @Param("end") Date end, @Param("tradeType") Long tradeType);
}

View File

@@ -1,8 +1,13 @@
package com.ruoyi.oa.mapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.ruoyi.oa.domain.SysOaWarehouseTask;
import com.ruoyi.oa.domain.vo.SysOaWarehouseTaskVo;
import com.ruoyi.common.core.mapper.BaseMapperPlus;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 采购计划Mapper接口

View File

@@ -1,6 +1,8 @@
package com.ruoyi.oa.service;
import com.ruoyi.oa.domain.bo.SysOaWarehouseDetailBo;
import com.ruoyi.oa.domain.vo.DashboardChartsVo;
import com.ruoyi.oa.domain.vo.DashboardMetricsVo;
import com.ruoyi.oa.domain.vo.SysOaOutWarehouseListVo;
import com.ruoyi.oa.domain.vo.SysOaProjectVo;
import com.ruoyi.oa.domain.bo.SysOaProjectBo;
@@ -78,4 +80,12 @@ public interface ISysOaProjectService {
TableDataInfo<SysOaProjectVo> listProjects(SysOaProjectBo bo, PageQuery pageQuery);
TableDataInfo<SysOaProjectVo> listWareProject(SysOaProjectBo bo, PageQuery pageQuery);
DashboardMetricsVo getMetrics(Date start, Date end,Long tradeType);
DashboardChartsVo getCharts(Date start, Date end,Long tradeType);
List<SysOaProjectVo> getExpiringForeignProjects(Integer days,Long tradeType);
}

View File

@@ -10,19 +10,18 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.oa.domain.bo.SysOaWarehouseDetailBo;
import com.ruoyi.oa.domain.vo.SysOaOutWarehouseListVo;
import com.ruoyi.oa.domain.vo.SysOaTaskVo;
import com.ruoyi.oa.domain.vo.*;
import com.ruoyi.oa.service.CodeGeneratorService;
import liquibase.pro.packaged.A;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.oa.domain.bo.SysOaProjectBo;
import com.ruoyi.oa.domain.vo.SysOaProjectVo;
import com.ruoyi.oa.domain.SysOaProject;
import com.ruoyi.oa.mapper.SysOaProjectMapper;
import com.ruoyi.oa.service.ISysOaProjectService;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.stream.Collectors;
@@ -44,7 +43,7 @@ public class SysOaProjectServiceImpl implements ISysOaProjectService {
// 1. 定义常量列表(最好放到某个常量类里)
private static final Set<String> VALID_PREFIXES = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(
"PL", "TC", "GI", "GL", "ZAM", "CC", "CR", "STL", "SM", "TH","RJ"
"PL", "TC", "GI", "GL", "ZAM", "CC", "CR", "STL", "SM", "TH", "RJ"
)));
@@ -98,7 +97,7 @@ public class SysOaProjectServiceImpl implements ISysOaProjectService {
*/
@Override
public Boolean insertByBo(SysOaProjectBo bo) {
if (bo.getProjectCode()!=null){
if (bo.getProjectCode() != null) {
bo.setProjectCode(codeGeneratorService.nextCode(bo.getProjectCode()));
}
SysOaProject add = BeanUtil.toBean(bo, SysOaProject.class);
@@ -126,6 +125,7 @@ public class SysOaProjectServiceImpl implements ISysOaProjectService {
}
// 2. 在你的逻辑里做判断
/**
* 保存前的数据校验
*/
@@ -262,12 +262,13 @@ public class SysOaProjectServiceImpl implements ISysOaProjectService {
qw.eq("sop.trade_type", bo.getTradeType());
qw.like(StringUtils.isNotBlank(bo.getProjectNum()), "sop.project_num", bo.getProjectNum());
qw.groupBy("sop.project_id");
Page<SysOaProjectVo> result = baseMapper.selectVoListPage(pageQuery.build(),qw);
Page<SysOaProjectVo> result = baseMapper.selectVoListPage(pageQuery.build(), qw);
return TableDataInfo.build(result);
}
/**
* 查看存在出库的项目
*
* @param bo
* @param pageQuery
* @return
@@ -275,12 +276,81 @@ public class SysOaProjectServiceImpl implements ISysOaProjectService {
@Override
public TableDataInfo<SysOaProjectVo> listWareProject(SysOaProjectBo bo, PageQuery pageQuery) {
QueryWrapper<SysOaProject> lqw = Wrappers.query();
lqw.like(StringUtils.isNotBlank(bo.getProjectName()), "sop.projec_name", bo.getProjectName());
lqw.like(StringUtils.isNotBlank(bo.getProjectName()), "sop.projec_name", bo.getProjectName());
Page<SysOaProjectVo> result = baseMapper.listWareProject(pageQuery.build(), lqw);
lqw.like(StringUtils.isNotBlank(bo.getProjectName()), "sop.project_name", bo.getProjectName());
lqw.like(StringUtils.isNotBlank(bo.getProjectCode()), "sop.project_code", bo.getProjectCode());
lqw.like(StringUtils.isNotBlank(bo.getProjectNum()), "sop.project_num", bo.getProjectNum());
Page<SysOaProjectVo> result = baseMapper.listWareProject(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
@Override
public DashboardMetricsVo getMetrics(Date start, Date end,Long tradeType) {
// 本期
BigDecimal curFunds = baseMapper.selectTotalFunds(start, end,tradeType);
Integer curCount = baseMapper.selectContractCount(start, end,tradeType);
Integer curExpire = baseMapper.selectExpiringCount(start, end,tradeType);
// 前期平均
BigDecimal avgFunds = baseMapper.selectPrevAvgTotalFunds(start, end,tradeType);
BigDecimal avgCount = baseMapper.selectPrevAvgContractCount(start, end,tradeType);
BigDecimal avgExpire = baseMapper.selectPrevAvgExpiringCount(start, end,tradeType);
// 计算增长率 = (cur - avg) / avg * 100
BigDecimal fundRate = avgFunds.compareTo(BigDecimal.ZERO) == 0
? BigDecimal.ZERO
: curFunds.subtract(avgFunds)
.divide(avgFunds, 2, RoundingMode.HALF_UP)
.multiply(BigDecimal.valueOf(100));
BigDecimal countRate = avgCount.compareTo(BigDecimal.ZERO) == 0
? BigDecimal.ZERO
: BigDecimal.valueOf(curCount).subtract(avgCount)
.divide(avgCount, 2, RoundingMode.HALF_UP)
.multiply(BigDecimal.valueOf(100));
BigDecimal expireRate = avgExpire.compareTo(BigDecimal.ZERO) == 0
? BigDecimal.ZERO
: BigDecimal.valueOf(curExpire).subtract(avgExpire)
.divide(avgExpire, 2, RoundingMode.HALF_UP)
.multiply(BigDecimal.valueOf(100));
// 组装 VO
DashboardMetricsVo vo = new DashboardMetricsVo();
vo.setTotalFunds(curFunds);
vo.setGrowthFunds(fundRate);
vo.setContractCount(curCount);
vo.setGrowthCount(countRate);
vo.setExpiringCount(curExpire);
vo.setGrowthExpiring(expireRate);
// 用本月金额 ÷ 历史平均 × 100 得到 completionRate
BigDecimal completionRate;
if (avgFunds.compareTo(BigDecimal.ZERO) > 0) {
completionRate = curFunds
.divide(avgFunds, 2, RoundingMode.HALF_UP)
.multiply(BigDecimal.valueOf(100));
} else {
completionRate = BigDecimal.ZERO;
}
vo.setCompletionRate(completionRate);
return vo;
}
@Override
public DashboardChartsVo getCharts(Date start, Date end,Long tradeType) {
DashboardChartsVo vo = new DashboardChartsVo();
vo.setContractAmountTrend(baseMapper.selectContractAmountTrend(start, end,tradeType));
vo.setProjectStatusDistribution(baseMapper.selectProjectStatusDistribution(tradeType));
vo.setMonthlyContractComparison(baseMapper.selectMonthlyContractComparison(start, end,tradeType));
return vo;
}
@Override
public List<SysOaProjectVo> getExpiringForeignProjects(Integer expireDays,Long tradeType) {
Date now = new Date();
return baseMapper.selectExpiringForeignProjects(now, expireDays,tradeType);
}
private QueryWrapper<SysOaProject> buildOutWareQueryWrapper(SysOaWarehouseDetailBo bo) {
QueryWrapper<SysOaProject> lqw = Wrappers.query();

View File

@@ -71,7 +71,6 @@ public class SysOaRemindServiceImpl implements ISysOaRemindService {
sysOaTaskBo.setState(0L);
sysOaTaskBo.setWorkerId(LoginHelper.getUserId());
List<SysOaTaskVo> tasks = sysOaTaskService.queryListByRemain(sysOaTaskBo,pageQuery);
System.out.println(tasks);
ArrayList<SysOaRemindVo> sysOaRemindVos = new ArrayList<>();
for (SysOaTaskVo task : tasks) {
SysOaRemindVo sysOaRemindVo = new SysOaRemindVo();
@@ -111,34 +110,21 @@ public class SysOaRemindServiceImpl implements ISysOaRemindService {
}
// 查询邻近过期进度
OaProgressBo oaProgressBo = new OaProgressBo();
oaProgressBo.setType(1L);
List<OaProgressVo> rows1 = progressService.queryPageList(oaProgressBo, pageQuery).getRows();
for (OaProgressVo row : rows1) {
if (row.getRemainTime()!=null && row.getStatus() !=1L && row.getRemainTime()<3L){
SysOaRemindVo sysOaRemindVo = new SysOaRemindVo();
sysOaRemindVo.setType("progress-project");
sysOaRemindVo.setContent(row.getProgressName());
sysOaRemindVo.setRemainTime(row.getRemainTime());
sysOaRemindVo.setTaskTime(row.getEndTime());
sysOaRemindVos.add(sysOaRemindVo);
}
// OaProgressBo oaProgressBo = new OaProgressBo();
// oaProgressBo.setType(1L);
// List<OaProgressVo> rows1 = progressService.queryPageList(oaProgressBo, pageQuery).getRows();
// for (OaProgressVo row : rows1) {
// if (row.getRemainTime()!=null && row.getStatus() ==0L && row.getRemainTime()<3L){
// SysOaRemindVo sysOaRemindVo = new SysOaRemindVo();
// sysOaRemindVo.setType("progress-project");
// sysOaRemindVo.setContent(row.getProgressName());
// sysOaRemindVo.setRemainTime(row.getRemainTime());
// sysOaRemindVo.setTaskTime(row.getEndTime());
// sysOaRemindVos.add(sysOaRemindVo);
// }
//
// }
}
// 查询邻近过期进度
oaProgressBo.setType(2L);
List<OaProgressVo> rows2 = progressService.queryPageList(oaProgressBo, pageQuery).getRows();
for (OaProgressVo row : rows2) {
if (row.getRemainTime()!=null && row.getRemainTime()<3L){
SysOaRemindVo sysOaRemindVo = new SysOaRemindVo();
sysOaRemindVo.setType("progress-money");
sysOaRemindVo.setContent(row.getProgressName());
sysOaRemindVo.setRemainTime(row.getRemainTime());
sysOaRemindVo.setTaskTime(row.getPayEndTime());
sysOaRemindVos.add(sysOaRemindVo);
}
}
return R.ok(sysOaRemindVos);
}

View File

@@ -172,9 +172,12 @@ public class SysOaWarehouseServiceImpl implements ISysOaWarehouseService {
if (select == null) {
baseMapper.insert(add);
flag = add.getId();
} else {
} else {
select.setInventory(select.getInventory() + bo.getInventory());
select.setPrice((select.getPrice() * select.getInventory() + bo.getPrice() * bo.getInventory()) / (select.getInventory() + bo.getInventory()));
if (bo.getPrice()!=null && bo.getPrice()>0) {
select.setPrice((select.getPrice() * select.getInventory() + bo.getPrice() * bo.getInventory()) / (select.getInventory() + bo.getInventory()));
}
flag = select.getId();
}

View File

@@ -167,7 +167,6 @@ public class SysOaWarehouseTaskServiceImpl implements ISysOaWarehouseTaskService
@Override
public int updateToWare(SysOaWarehouseTaskBo bo) {
System.out.println(bo);
// 判断是否为此物料完成状态
if (bo.getTaskStatus() == 2) {
Long masterId;
@@ -197,10 +196,8 @@ public class SysOaWarehouseTaskServiceImpl implements ISysOaWarehouseTaskService
.eq(SysOaWarehouseTask::getMasterId, bo.getMasterId())
.in(SysOaWarehouseTask::getTaskStatus, Arrays.asList(0, 1));
List<SysOaWarehouseTask> sysOaWarehouseTasks = baseMapper.selectList(taskLambdaQueryWrapper);
System.out.println(sysOaWarehouseTasks);
if (sysOaWarehouseTasks.isEmpty()) {
SysOaWarehouseMasterVo sysOaWarehouseMasterVo = masterMapper.selectVoById(bo.getMasterId());
System.out.println("184513807548012740712308470812");
// 如果为空代表了所有都结束了 将采购单状态置1
sysOaWarehouseMasterVo.setStatus(1L);
masterMapper.updateById(BeanUtil.toBean(sysOaWarehouseMasterVo, SysOaWarehouseMaster.class));
@@ -213,7 +210,7 @@ public class SysOaWarehouseTaskServiceImpl implements ISysOaWarehouseTaskService
return baseMapper.updateById(task);
}
private int toWareOne(Long masterId, SysOaWarehouseTaskBo bo, SysOaWarehouseDetailBo sysOaWarehouseDetailBo) {
private int toWareOne(Long masterId, SysOaWarehouseTaskBo bo , SysOaWarehouseDetailBo sysOaWarehouseDetailBo) {
// 进行入库操作 (因为存在一种情况是此为全新物料是没有物料id的)
SysOaWarehouse sysOaWarehouse = new SysOaWarehouse();
Long warehouseId = 0L;
@@ -226,16 +223,14 @@ public class SysOaWarehouseTaskServiceImpl implements ISysOaWarehouseTaskService
sysOaWarehouse.setSpecifications(bo.getSpecifications());
sysOaWarehouse.setName(bo.getName());
sysOaWarehouse.setRemark(bo.getRemark());
sysOaWarehouse.setUnit("");
sysOaWarehouse.setUnit(bo.getUnit());
wareMapper.insert(sysOaWarehouse);
warehouseId = sysOaWarehouse.getId();
} else {
warehouseId = bo.getWarehouseId();
sysOaWarehouse = wareMapper.selectById(warehouseId);
sysOaWarehouse.setPrice((sysOaWarehouse.getPrice() * sysOaWarehouse.getInventory() + bo.getPrice() * bo.getTaskInventory()) / (sysOaWarehouse.getInventory() + bo.getTaskInventory()));
sysOaWarehouse.setInventory(sysOaWarehouse.getInventory() + bo.getTaskInventory());
System.out.println(sysOaWarehouse);
wareMapper.updateById(sysOaWarehouse);
}

View File

@@ -124,71 +124,66 @@
<select id="selectVoPagePlus" resultType="com.ruoyi.oa.domain.vo.OaProgressVo">
SELECT
op.progress_id,
op.project_id,
op.contact_phone,
op.type,
op.progress_name,
op.parent_id,
op.del_flag,
op.sort,
op.remark,
op.status,
op.amount,
op.time_remark,
sop.project_name,
sop.project_num,
sop.funds,
-- 获取 detail_status = 0 且 plan_start_date 最小的记录的 detail_name 作为 nowLevel
(
SELECT d.detail_name
SELECT op.progress_id,
op.project_id,
op.contact_phone,
op.type,
op.progress_name,
op.parent_id,
op.del_flag,
op.sort,
op.remark,
op.status,
op.amount,
op.time_remark,
sop.project_name,
sop.project_num,
sop.funds,
-- 获取 detail_status = 0 且 plan_start_date 最小的记录的 detail_name 作为 nowLevel
(SELECT d.detail_name
FROM oa_progress_detail d
WHERE d.progress_id = op.progress_id
AND d.detail_status = 0
ORDER BY d.plan_start_date ASC
LIMIT 1
) AS nowLevel,
(
SELECT d.detail_id
LIMIT 1) AS nowLevel,
(select op2.contact_phone
from oa_progress op2
where op2.progress_id = op.parent_id) as parentPhone,
(SELECT d.detail_id
FROM oa_progress_detail d
WHERE d.progress_id = op.progress_id
AND d.detail_status = 0
ORDER BY d.plan_start_date ASC
LIMIT 1
) AS nowLevelId,
-- 计算该记录 plan_end_date 与当前时间的天数差值作为 remainTime
(
SELECT TIMESTAMPDIFF(DAY, NOW(), d.plan_end_date)
LIMIT 1) AS nowLevelId,
-- 计算该记录 plan_end_date 与当前时间的天数差值作为 remainTime
(SELECT TIMESTAMPDIFF(DAY, NOW(), d.plan_end_date)
FROM oa_progress_detail d
WHERE d.progress_id = op.progress_id
AND d.detail_status = 0
ORDER BY d.plan_start_date ASC
LIMIT 1
) AS remainTime,
LIMIT 1) AS remainTime,
(SELECT d.department
FROM oa_progress_detail d
WHERE d.progress_id = op.progress_id
AND d.detail_status = 0
ORDER BY d.plan_start_date ASC
LIMIT 1) AS nowDepart,
(SELECT d.plan_end_date
FROM oa_progress_detail d
WHERE d.progress_id = op.progress_id
AND d.detail_status = 0
ORDER BY d.plan_start_date ASC
LIMIT 1) AS endTime,
(
SELECT d.plan_end_date
FROM oa_progress_detail d
WHERE d.progress_id = op.progress_id
AND d.detail_status = 0
ORDER BY d.plan_start_date ASC
LIMIT 1
) AS endTime,
(
SELECT d.plan_pay_date
(SELECT d.plan_pay_date
FROM oa_progress_detail d
WHERE d.progress_id = op.progress_id
ORDER BY d.plan_pay_date ASC
LIMIT 1
) AS payEndTime,
-- 计算当前 progress 对应的 detail 完成比例:满足 detail_status = 1 的条数 / 总条数避免除0
(
SELECT IF(COUNT(*) = 0, 0, ROUND(SUM(CASE WHEN d.detail_status = 1 THEN 1 ELSE 0 END) / COUNT(*), 2))
LIMIT 1) AS payEndTime,
-- 计算当前 progress 对应的 detail 完成比例:满足 detail_status = 1 的条数 / 总条数避免除0
(SELECT IF(COUNT(*) = 0, 0, ROUND(SUM(CASE WHEN d.detail_status = 1 THEN 1 ELSE 0 END) / COUNT(*), 2))
FROM oa_progress_detail d
WHERE d.progress_id = op.progress_id
) AS detailCompletePercent
WHERE d.progress_id = op.progress_id) AS detailCompletePercent
FROM oa_progress op
LEFT JOIN sys_oa_project sop ON sop.project_id = op.project_id
${ew.getCustomSqlSegment}

View File

@@ -585,6 +585,189 @@
from sys_oa_project sop
where sop.project_id = #{projectId}
</select>
<!-- 本月合同总额 -->
<select id="selectTotalFunds" resultType="java.math.BigDecimal">
SELECT IFNULL(SUM(funds),0)
FROM sys_oa_project
<where>
AND begin_time BETWEEN #{start} AND #{end}
<if test="tradeType !=null and tradeType !=''">
and trade_type = #{tradeType}
</if>
</where>
</select>
<!-- 历史(月度)平均合同总额 -->
<select id="selectPrevAvgTotalFunds" resultType="java.math.BigDecimal">
SELECT IFNULL(AVG(monthly_sum),0)
FROM (
SELECT SUM(funds) AS monthly_sum
FROM sys_oa_project
<where>
AND begin_time &lt; #{start}
<if test="tradeType !=null and tradeType !=''">
and trade_type = #{tradeType}
</if>
</where>
GROUP BY YEAR(begin_time), MONTH(begin_time)
) t
</select>
<!-- 本月合同数量 -->
<select id="selectContractCount" resultType="java.lang.Integer">
SELECT COUNT(*)
FROM sys_oa_project
<where>
AND begin_time BETWEEN #{start} AND #{end}
<if test="tradeType !=null and tradeType !=''">
and trade_type = #{tradeType}
</if>
</where>
</select>
<!-- 历史(月度)平均合同数量 -->
<select id="selectPrevAvgContractCount" resultType="java.math.BigDecimal">
SELECT IFNULL(AVG(monthly_cnt),0)
FROM (
SELECT COUNT(*) AS monthly_cnt
FROM sys_oa_project
<where>
AND begin_time &lt; #{start}
<if test="tradeType !=null and tradeType !=''">
and trade_type = #{tradeType}
</if>
</where>
GROUP BY YEAR(begin_time), MONTH(begin_time)
) t
</select>
<!-- 本月临期项目数(仅未完成) -->
<select id="selectExpiringCount" resultType="java.lang.Integer">
SELECT COUNT(*)
FROM sys_oa_project
<where>
AND project_status = '0'
AND finish_time BETWEEN #{start} AND #{end}
<if test="tradeType !=null and tradeType !=''">
and trade_type = #{tradeType}
</if>
</where>
</select>
<!-- 历史(月度)平均临期项目数 -->
<select id="selectPrevAvgExpiringCount" resultType="java.math.BigDecimal">
SELECT IFNULL(AVG(monthly_expiring),0)
FROM (
SELECT COUNT(*) AS monthly_expiring
FROM sys_oa_project
<where>
AND project_status = '0'
AND finish_time &lt; #{start}
<if test="tradeType !=null and tradeType !=''">
and trade_type = #{tradeType}
</if>
</where>
GROUP BY YEAR(finish_time), MONTH(finish_time)
) t
</select>
<select id="selectContractAmountTrend" resultType="com.ruoyi.oa.domain.vo.TrendPointVo">
SELECT
CONCAT(t.mth, '月') AS month,
t.value
FROM (
SELECT
YEAR(begin_time) AS yr,
MONTH(begin_time) AS mth,
IFNULL(SUM(funds),0) AS value
FROM sys_oa_project
<where>
AND begin_time BETWEEN #{start} AND #{end}
<if test="tradeType !=null and tradeType !=''">
and trade_type = #{tradeType}
</if>
</where>
GROUP BY
YEAR(begin_time),
MONTH(begin_time)
) AS t
ORDER BY
t.yr,
t.mth
</select>
<select id="selectProjectStatusDistribution" resultType="com.ruoyi.oa.domain.vo.StatusCountVo">
SELECT status, COUNT(*) AS count FROM (
SELECT
CASE
WHEN NOW() > finish_time THEN '已逾期'
WHEN finish_time BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 7 DAY) THEN '即将到期'
WHEN project_status = '0' THEN '进行中'
ELSE '正常'
END AS status
FROM sys_oa_project
<where>
<if test="tradeType !=null and tradeType !=''">
and trade_type = #{tradeType}
</if>
</where>
) t
GROUP BY status
</select>
<select id="selectMonthlyContractComparison" resultType="com.ruoyi.oa.domain.vo.TrendPointVo">
SELECT
CONCAT(t.mth, '月') AS month,
t.value
FROM (
SELECT
YEAR(begin_time) AS yr,
MONTH(begin_time) AS mth,
COUNT(*) AS value
FROM sys_oa_project
<where>
AND begin_time BETWEEN #{start} AND #{end}
<if test="tradeType !=null and tradeType !=''">
and trade_type = #{tradeType}
</if>
</where>
GROUP BY
YEAR(begin_time),
MONTH(begin_time)
) AS t
ORDER BY
t.yr,
t.mth
</select>
<select id="selectExpiringForeignProjects" resultType="com.ruoyi.oa.domain.vo.SysOaProjectVo">
SELECT
p.project_id AS projectId,
p.project_name AS projectName,
p.funds AS funds,
p.finish_time AS finishTime,
CASE
WHEN NOW() > p.finish_time THEN '已逾期'
WHEN p.finish_time BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL #{expireDays} DAY) THEN '即将到期'
ELSE '进行中'
END AS status,
TIMESTAMPDIFF(
DAY,
NOW(),
p.finish_time
) AS remainTime
FROM sys_oa_project p
<where>
AND TIMESTAMPDIFF(DAY, NOW(), p.finish_time) &lt; #{expireDays}
AND p.project_status = '0'
<if test="tradeType !=null and tradeType !=''">
and p.trade_type = #{tradeType}
</if>
</where>
ORDER BY
TIMESTAMPDIFF(DAY, NOW(), p.finish_time) ASC
</select>
</mapper>