feat(sip): 添加项目管理功能

- 新增项目管理相关的 HTML 模板文件
- 实现项目管理的前端页面逻辑
- 添加项目管理的后端接口和服务
- 集成项目管理到现有的系统中
master
chenhao 2025-05-30 10:10:24 +08:00
parent 82c78d9b23
commit 3ef4149d83
27 changed files with 2550 additions and 3 deletions

View File

@ -36,6 +36,10 @@
<option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
</select>
</li>
<li>
<label>合同名称:</label>
<input type="text" name="orderName"/>
</li>
<li>
<a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
<a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;重置</a>

View File

@ -0,0 +1,197 @@
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
<head>
<th:block th:include="include :: header('新增项目管理')" />
<th:block th:include="include :: datetimepicker-css" />
</head>
<body class="white-bg">
<div class="wrapper wrapper-content animated fadeInRight ibox-content">
<form class="form-horizontal m" id="form-product-add">
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">项目编码:</label>
<div class="col-sm-8">
<input name="projectCode" class="form-control" type="text">
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">项目名称:</label>
<div class="col-sm-8">
<input name="projectName" class="form-control" type="text">
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">客户code</label>
<div class="col-sm-8">
<input name="customerCode" class="form-control" type="text">
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">客户名称:</label>
<div class="col-sm-8">
<input name="customerName" class="form-control" type="text">
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">属地:</label>
<div class="col-sm-8">
<input name="province" class="form-control" type="text">
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">项目阶段:</label>
<div class="col-sm-8">
<input name="projectStage" class="form-control" type="text">
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">项目把握度:</label>
<div class="col-sm-8">
<input name="projectGraspDegree" class="form-control" type="text">
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">汇智支撑人员id</label>
<div class="col-sm-8">
<input name="hzSupportUser" class="form-control" type="text">
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">运作机构:</label>
<div class="col-sm-8">
<input name="operateInstitution" class="form-control" type="text">
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">代理商code</label>
<div class="col-sm-8">
<input name="partnerCode" class="form-control" type="text">
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">联系方式:</label>
<div class="col-sm-8">
<input name="contactWay" class="form-control" type="text">
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">预计金额:</label>
<div class="col-sm-8">
<input name="estimatedAmount" class="form-control" type="text">
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">预计下单时间:</label>
<div class="col-sm-8">
<div class="input-group date">
<input name="estimatedOrderTime" class="form-control" placeholder="yyyy-MM-dd" type="text">
<span class="input-group-addon"><i class="fa fa-calendar"></i></span>
</div>
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">预计发货时间:</label>
<div class="col-sm-8">
<div class="input-group date">
<input name="estimatedDeliverTime" class="form-control" placeholder="yyyy-MM-dd" type="text">
<span class="input-group-addon"><i class="fa fa-calendar"></i></span>
</div>
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">竞争对手:</label>
<div class="col-sm-8">
<input name="competitor" class="form-control" type="text">
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">是否国产:</label>
<div class="col-sm-8">
<input name="countryProduct" class="form-control" type="text">
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">服务器配置:</label>
<div class="col-sm-8">
<input name="serverConfiguration" class="form-control" type="text">
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">关键技术问题:</label>
<div class="col-sm-8">
<input name="keyProblem" class="form-control" type="text">
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">项目描述:</label>
<div class="col-sm-8">
<input name="projectDesc" class="form-control" type="text">
</div>
</div>
</div>
</form>
</div>
<th:block th:include="include :: footer" />
<th:block th:include="include :: datetimepicker-js" />
<script th:inline="javascript">
var prefix = ctx + "sip/project"
$("#form-product-add").validate({
focusCleanup: true
});
function submitHandler() {
if ($.validate.form()) {
$.operate.save(prefix + "/add", $('#form-product-add').serialize());
}
}
$("input[name='estimatedOrderTime']").datetimepicker({
format: "yyyy-mm-dd",
minView: "month",
autoclose: true
});
$("input[name='estimatedDeliverTime']").datetimepicker({
format: "yyyy-mm-dd",
minView: "month",
autoclose: true
});
</script>
</body>
</html>

View File

@ -0,0 +1,198 @@
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
<head>
<th:block th:include="include :: header('修改项目管理')" />
<th:block th:include="include :: datetimepicker-css" />
</head>
<body class="white-bg">
<div class="wrapper wrapper-content animated fadeInRight ibox-content">
<form class="form-horizontal m" id="form-product-edit" th:object="${projectInfo}">
<input name="id" th:field="*{id}" type="hidden">
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">项目编码:</label>
<div class="col-sm-8">
<input name="projectCode" th:field="*{projectCode}" class="form-control" type="text">
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">项目名称:</label>
<div class="col-sm-8">
<input name="projectName" th:field="*{projectName}" class="form-control" type="text">
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">客户code</label>
<div class="col-sm-8">
<input name="customerCode" th:field="*{customerCode}" class="form-control" type="text">
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">客户名称:</label>
<div class="col-sm-8">
<input name="customerName" th:field="*{customerName}" class="form-control" type="text">
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">属地:</label>
<div class="col-sm-8">
<input name="province" th:field="*{province}" class="form-control" type="text">
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">项目阶段:</label>
<div class="col-sm-8">
<input name="projectStage" th:field="*{projectStage}" class="form-control" type="text">
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">项目把握度:</label>
<div class="col-sm-8">
<input name="projectGraspDegree" th:field="*{projectGraspDegree}" class="form-control" type="text">
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">汇智支撑人员id</label>
<div class="col-sm-8">
<input name="hzSupportUser" th:field="*{hzSupportUser}" class="form-control" type="text">
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">运作机构:</label>
<div class="col-sm-8">
<input name="operateInstitution" th:field="*{operateInstitution}" class="form-control" type="text">
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">代理商code</label>
<div class="col-sm-8">
<input name="partnerCode" th:field="*{partnerCode}" class="form-control" type="text">
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">联系方式:</label>
<div class="col-sm-8">
<input name="contactWay" th:field="*{contactWay}" class="form-control" type="text">
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">预计金额:</label>
<div class="col-sm-8">
<input name="estimatedAmount" th:field="*{estimatedAmount}" class="form-control" type="text">
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">预计下单时间:</label>
<div class="col-sm-8">
<div class="input-group date">
<input name="estimatedOrderTime" th:value="${#dates.format(projectInfo.estimatedOrderTime, 'yyyy-MM-dd')}" class="form-control" placeholder="yyyy-MM-dd" type="text">
<span class="input-group-addon"><i class="fa fa-calendar"></i></span>
</div>
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">预计发货时间:</label>
<div class="col-sm-8">
<div class="input-group date">
<input name="estimatedDeliverTime" th:value="${#dates.format(projectInfo.estimatedDeliverTime, 'yyyy-MM-dd')}" class="form-control" placeholder="yyyy-MM-dd" type="text">
<span class="input-group-addon"><i class="fa fa-calendar"></i></span>
</div>
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">竞争对手:</label>
<div class="col-sm-8">
<input name="competitor" th:field="*{competitor}" class="form-control" type="text">
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">是否国产:</label>
<div class="col-sm-8">
<input name="countryProduct" th:field="*{countryProduct}" class="form-control" type="text">
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">服务器配置:</label>
<div class="col-sm-8">
<input name="serverConfiguration" th:field="*{serverConfiguration}" class="form-control" type="text">
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">关键技术问题:</label>
<div class="col-sm-8">
<input name="keyProblem" th:field="*{keyProblem}" class="form-control" type="text">
</div>
</div>
</div>
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">项目描述:</label>
<div class="col-sm-8">
<input name="projectDesc" th:field="*{projectDesc}" class="form-control" type="text">
</div>
</div>
</div>
</form>
</div>
<th:block th:include="include :: footer" />
<th:block th:include="include :: datetimepicker-js" />
<script th:inline="javascript">
var prefix = ctx + "sip/project";
$("#form-product-edit").validate({
focusCleanup: true
});
function submitHandler() {
if ($.validate.form()) {
$.operate.save(prefix + "/edit", $('#form-product-edit').serialize());
}
}
$("input[name='estimatedOrderTime']").datetimepicker({
format: "yyyy-mm-dd",
minView: "month",
autoclose: true
});
$("input[name='estimatedDeliverTime']").datetimepicker({
format: "yyyy-mm-dd",
minView: "month",
autoclose: true
});
</script>
</body>
</html>

View File

@ -0,0 +1,238 @@
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head>
<th:block th:include="include :: header('项目管理列表')" />
</head>
<body class="gray-bg">
<div class="container-div">
<div class="row">
<div class="col-sm-12 search-collapse">
<form id="formId">
<div class="select-list">
<ul>
<li>
<label>项目编码:</label>
<input type="text" name="projectCode"/>
</li>
<li>
<label>项目名称:</label>
<input type="text" name="projectName"/>
</li>
<li>
<label>客户code</label>
<input type="text" name="customerCode"/>
</li>
<li>
<label>客户名称:</label>
<input type="text" name="customerName"/>
</li>
<li>
<label>属地:</label>
<input type="text" name="province"/>
</li>
<li>
<label>项目阶段:</label>
<input type="text" name="projectStage"/>
</li>
<li>
<label>项目把握度:</label>
<input type="text" name="projectGraspDegree"/>
</li>
<li>
<label>汇智支撑人员id</label>
<input type="text" name="hzSupportUser"/>
</li>
<li>
<label>运作机构:</label>
<input type="text" name="operateInstitution"/>
</li>
<li>
<label>代理商code</label>
<input type="text" name="partnerCode"/>
</li>
<li>
<label>联系方式:</label>
<input type="text" name="contactWay"/>
</li>
<li>
<label>预计金额:</label>
<input type="text" name="estimatedAmount"/>
</li>
<li>
<label>预计下单时间:</label>
<input type="text" class="time-input" placeholder="请选择预计下单时间" name="estimatedOrderTime"/>
</li>
<li>
<label>预计发货时间:</label>
<input type="text" class="time-input" placeholder="请选择预计发货时间" name="estimatedDeliverTime"/>
</li>
<li>
<label>竞争对手:</label>
<input type="text" name="competitor"/>
</li>
<li>
<label>是否国产:</label>
<input type="text" name="countryProduct"/>
</li>
<li>
<label>服务器配置:</label>
<input type="text" name="serverConfiguration"/>
</li>
<li>
<label>关键技术问题:</label>
<input type="text" name="keyProblem"/>
</li>
<li>
<label>项目描述:</label>
<input type="text" name="projectDesc"/>
</li>
<li>
<a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
<a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;重置</a>
</li>
</ul>
</div>
</form>
</div>
<div class="btn-group-sm" id="toolbar" role="group">
<a class="btn btn-success" onclick="$.operate.add()" shiro:hasPermission="sip:product:add">
<i class="fa fa-plus"></i> 添加
</a>
<a class="btn btn-primary single disabled" onclick="$.operate.edit()" shiro:hasPermission="sip:product:edit">
<i class="fa fa-edit"></i> 修改
</a>
<a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()" shiro:hasPermission="sip:product:remove">
<i class="fa fa-remove"></i> 删除
</a>
<a class="btn btn-warning" onclick="$.table.exportExcel()" shiro:hasPermission="sip:product:export">
<i class="fa fa-download"></i> 导出
</a>
</div>
<div class="col-sm-12 select-table table-striped">
<table id="bootstrap-table"></table>
</div>
</div>
</div>
<th:block th:include="include :: footer" />
<script th:inline="javascript">
var editFlag = [[${@permission.hasPermi('sip:product:edit')}]];
var removeFlag = [[${@permission.hasPermi('sip:product:remove')}]];
var prefix = ctx + "sip/project";
$(function() {
var options = {
url: prefix + "/list",
createUrl: prefix + "/add",
updateUrl: prefix + "/edit/{id}",
removeUrl: prefix + "/remove",
exportUrl: prefix + "/export",
modalName: "项目管理",
columns: [{
checkbox: true
},
{
field: 'id',
title: '',
visible: false
},
{
field: 'projectCode',
title: '项目编码'
},
{
field: 'projectName',
title: '项目名称'
},
{
field: 'customerCode',
title: '客户code'
},
{
field: 'customerName',
title: '客户名称'
},
{
field: 'industryType',
title: '行业'
},
{
field: 'province',
title: '属地'
},
{
field: 'projectStage',
title: '项目阶段'
},
{
field: 'projectGraspDegree',
title: '项目把握度'
},
{
field: 'hzSupportUser',
title: '汇智支撑人员id'
},
{
field: 'operateInstitution',
title: '运作机构'
},
{
field: 'partnerCode',
title: '代理商code'
},
{
field: 'contactWay',
title: '联系方式'
},
{
field: 'estimatedAmount',
title: '预计金额'
},
{
field: 'currencyType',
title: '币种'
},
{
field: 'estimatedOrderTime',
title: '预计下单时间'
},
{
field: 'estimatedDeliverTime',
title: '预计发货时间'
},
{
field: 'competitor',
title: '竞争对手'
},
{
field: 'countryProduct',
title: '是否国产'
},
{
field: 'serverConfiguration',
title: '服务器配置'
},
{
field: 'keyProblem',
title: '关键技术问题'
},
{
field: 'projectDesc',
title: '项目描述'
},
{
title: '操作',
align: 'center',
formatter: function(value, row, index) {
var actions = [];
actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.id + '\')"><i class="fa fa-edit"></i>编辑</a> ');
actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.id + '\')"><i class="fa fa-remove"></i>删除</a>');
return actions.join('');
}
}]
};
$.table.init(options);
});
</script>
</body>
</html>

View File

@ -0,0 +1,128 @@
package com.ruoyi.sip.controller;
import java.util.List;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.sip.domain.ProjectInfo;
import com.ruoyi.sip.service.IProjectInfoService;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
/**
* Controller
*
* @author ruoyi
* @date 2025-05-29
*/
@Controller
@RequestMapping("/sip/project")
public class ProjectInfoController extends BaseController
{
private String prefix = "/project/info";
@Autowired
private IProjectInfoService projectInfoService;
@RequiresPermissions("sip:project:view")
@GetMapping()
public String product()
{
return prefix + "/project";
}
/**
*
*/
@RequiresPermissions("sip:project:list")
@PostMapping("/list")
@ResponseBody
public TableDataInfo list(ProjectInfo projectInfo)
{
startPage();
List<ProjectInfo> list = projectInfoService.selectProjectInfoList(projectInfo);
return getDataTable(list);
}
/**
*
*/
@RequiresPermissions("sip:project:export")
@Log(title = "项目管理", businessType = BusinessType.EXPORT)
@PostMapping("/export")
@ResponseBody
public AjaxResult export(ProjectInfo projectInfo)
{
List<ProjectInfo> list = projectInfoService.selectProjectInfoList(projectInfo);
ExcelUtil<ProjectInfo> util = new ExcelUtil<ProjectInfo>(ProjectInfo.class);
return util.exportExcel(list, "项目管理数据");
}
/**
*
*/
@RequiresPermissions("sip:project:add")
@GetMapping("/add")
public String add()
{
return prefix + "/add";
}
/**
*
*/
@RequiresPermissions("sip:project:add")
@Log(title = "项目管理", businessType = BusinessType.INSERT)
@PostMapping("/add")
@ResponseBody
public AjaxResult addSave(ProjectInfo projectInfo)
{
return toAjax(projectInfoService.insertProjectInfo(projectInfo));
}
/**
*
*/
@RequiresPermissions("sip:project:edit")
@GetMapping("/edit/{id}")
public String edit(@PathVariable("id") Long id, ModelMap mmap)
{
ProjectInfo projectInfo = projectInfoService.selectProjectInfoById(id);
mmap.put("projectInfo", projectInfo);
return prefix + "/edit";
}
/**
*
*/
@RequiresPermissions("sip:project:edit")
@Log(title = "项目管理", businessType = BusinessType.UPDATE)
@PostMapping("/edit")
@ResponseBody
public AjaxResult editSave(ProjectInfo projectInfo)
{
return toAjax(projectInfoService.updateProjectInfo(projectInfo));
}
/**
*
*/
@RequiresPermissions("sip:project:remove")
@Log(title = "项目管理", businessType = BusinessType.DELETE)
@PostMapping( "/remove")
@ResponseBody
public AjaxResult remove(String ids)
{
return toAjax(projectInfoService.deleteProjectInfoByIds(ids));
}
}

View File

@ -0,0 +1,122 @@
package com.ruoyi.sip.domain;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
/**
* project_info
*
* @author ruoyi
* @date 2025-05-29
*/
@Data
public class ProjectInfo extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** */
private Long id;
/** 项目编码 */
@Excel(name = "项目编码")
private String projectCode;
/** 项目名称 */
@Excel(name = "项目名称")
private String projectName;
/** 客户code */
@Excel(name = "客户code")
private String customerCode;
/** 客户名称 */
@Excel(name = "客户名称")
private String customerName;
/** 行业 */
@Excel(name = "行业")
private String industryType;
/** 属地 */
@Excel(name = "属地")
private String province;
/** 项目阶段 */
@Excel(name = "项目阶段")
private String projectStage;
/** 项目把握度 */
@Excel(name = "项目把握度")
private String projectGraspDegree;
/** 汇智支撑人员id */
@Excel(name = "汇智支撑人员id")
private String hzSupportUser;
/** 运作机构 */
@Excel(name = "运作机构")
private String operateInstitution;
/** 代理商code */
@Excel(name = "代理商code")
private String partnerCode;
/** 联系方式 */
@Excel(name = "联系方式")
private String contactWay;
/** 预计金额 */
@Excel(name = "预计金额")
private BigDecimal estimatedAmount;
/** 币种 */
@Excel(name = "币种")
private String currencyType;
/** 预计下单时间 */
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@Excel(name = "预计下单时间", width = 30, dateFormat = "yyyy-MM-dd")
private Date estimatedOrderTime;
/** 预计发货时间 */
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@Excel(name = "预计发货时间", width = 30, dateFormat = "yyyy-MM-dd")
private Date estimatedDeliverTime;
/** 竞争对手 */
@Excel(name = "竞争对手")
private String competitor;
/** 是否国产 */
@Excel(name = "是否国产")
private String countryProduct;
/** 服务器配置 */
@Excel(name = "服务器配置")
private String serverConfiguration;
/** 关键技术问题 */
@Excel(name = "关键技术问题")
private String keyProblem;
/** 项目描述 */
@Excel(name = "项目描述")
private String projectDesc;
/** 软件项目产品信息 */
private List<ProjectProductInfo> softwareProjectProductInfoList;
/** 硬件项目产品信息 */
private List<ProjectProductInfo> hardwareProjectProductInfoList;
/** 项目操作日志信息 */
private List<ProjectOperateLog> projectOperateLogList;
/** 项目工作进度信息 */
private List<ProjectWorkProgress> projectWorkProgressList;
}

View File

@ -0,0 +1,100 @@
package com.ruoyi.sip.domain;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
/**
* project_operate_log
*
* @author ruoyi
* @date 2025-05-29
*/
public class ProjectOperateLog extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** */
private Long id;
/** 操作内容 */
@Excel(name = "操作内容")
private String operateLog;
/** 操作人员 */
@Excel(name = "操作人员")
private String operateUser;
/** 操作时间 */
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@Excel(name = "操作时间", width = 30, dateFormat = "yyyy-MM-dd")
private Date operateTime;
/** 项目id */
@Excel(name = "项目id")
private Long projectId;
public void setId(Long id)
{
this.id = id;
}
public Long getId()
{
return id;
}
public void setOperateLog(String operateLog)
{
this.operateLog = operateLog;
}
public String getOperateLog()
{
return operateLog;
}
public void setOperateUser(String operateUser)
{
this.operateUser = operateUser;
}
public String getOperateUser()
{
return operateUser;
}
public void setOperateTime(Date operateTime)
{
this.operateTime = operateTime;
}
public Date getOperateTime()
{
return operateTime;
}
public void setProjectId(Long projectId)
{
this.projectId = projectId;
}
public Long getProjectId()
{
return projectId;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("operateLog", getOperateLog())
.append("operateUser", getOperateUser())
.append("operateTime", getOperateTime())
.append("projectId", getProjectId())
.toString();
}
}

View File

@ -0,0 +1,41 @@
package com.ruoyi.sip.domain;
import java.util.List;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
/**
* project_product_info
*
* @author ruoyi
* @date 2025-05-29
*/
@Data
public class ProjectProductInfo extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** */
private Long id;
/** 项目id */
@Excel(name = "项目id")
private Long projectId;
/** 产品编码 */
@Excel(name = "产品编码")
private String productCode;
/** 数量 */
@Excel(name = "数量")
private Long quantity;
private String type;
private String model;
}

View File

@ -0,0 +1,43 @@
package com.ruoyi.sip.domain;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
/**
* project_work_progress
*
* @author ruoyi
* @date 2025-05-29
*/
@Data
public class ProjectWorkProgress extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** */
private Long id;
/** 变更内容 */
@Excel(name = "变更内容")
private String workContent;
/** 更新人 */
@Excel(name = "更新人")
private String workUser;
/** 更新时间 */
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@Excel(name = "更新时间", width = 30, dateFormat = "yyyy-MM-dd")
private Date workTime;
/** 项目id */
@Excel(name = "项目id")
private Long projectId;
private String userName;
}

View File

@ -0,0 +1,63 @@
package com.ruoyi.sip.mapper;
import java.util.List;
import com.ruoyi.sip.domain.ProjectInfo;
/**
* Mapper
*
* @author ruoyi
* @date 2025-05-29
*/
public interface ProjectInfoMapper
{
/**
*
*
* @param id
* @return
*/
public ProjectInfo selectProjectInfoById(Long id);
/**
*
*
* @param projectInfo
* @return
*/
public List<ProjectInfo> selectProjectInfoList(ProjectInfo projectInfo);
/**
*
*
* @param projectInfo
* @return
*/
public int insertProjectInfo(ProjectInfo projectInfo);
/**
*
*
* @param projectInfo
* @return
*/
public int updateProjectInfo(ProjectInfo projectInfo);
/**
*
*
* @param id
* @return
*/
public int deleteProjectInfoById(Long id);
/**
*
*
* @param ids
* @return
*/
public int deleteProjectInfoByIds(String[] ids);
String selectMaxProjectCode(ProjectInfo projectInfo);
}

View File

@ -0,0 +1,63 @@
package com.ruoyi.sip.mapper;
import java.util.List;
import com.ruoyi.sip.domain.ProjectOperateLog;
/**
* Mapper
*
* @author ruoyi
* @date 2025-05-29
*/
public interface ProjectOperateLogMapper
{
/**
*
*
* @param id
* @return
*/
public ProjectOperateLog selectProjectOperateLogById(Long id);
/**
*
*
* @param projectOperateLog
* @return
*/
public List<ProjectOperateLog> selectProjectOperateLogList(ProjectOperateLog projectOperateLog);
/**
*
*
* @param projectOperateLog
* @return
*/
public int insertProjectOperateLog(ProjectOperateLog projectOperateLog);
/**
*
*
* @param projectOperateLog
* @return
*/
public int updateProjectOperateLog(ProjectOperateLog projectOperateLog);
/**
*
*
* @param id
* @return
*/
public int deleteProjectOperateLogById(Long id);
/**
*
*
* @param ids
* @return
*/
public int deleteProjectOperateLogByIds(String[] ids);
List<ProjectOperateLog> selectProjectOperateLogListByProjectId(Long id);
}

View File

@ -0,0 +1,65 @@
package com.ruoyi.sip.mapper;
import java.util.List;
import com.ruoyi.sip.domain.ProjectProductInfo;
/**
* Mapper
*
* @author ruoyi
* @date 2025-05-29
*/
public interface ProjectProductInfoMapper
{
/**
*
*
* @param id
* @return
*/
public ProjectProductInfo selectProjectProductInfoById(Long id);
/**
*
*
* @param projectProductInfo
* @return
*/
public List<ProjectProductInfo> selectProjectProductInfoList(ProjectProductInfo projectProductInfo);
/**
*
*
* @param projectProductInfo
* @return
*/
public int insertProjectProductInfo(ProjectProductInfo projectProductInfo);
/**
*
*
* @param projectProductInfo
* @return
*/
public int updateProjectProductInfo(ProjectProductInfo projectProductInfo);
/**
*
*
* @param id
* @return
*/
public int deleteProjectProductInfoById(Long id);
/**
*
*
* @param ids
* @return
*/
public int deleteProjectProductInfoByIds(String[] ids);
List<ProjectProductInfo> selectProjectProductInfoListByProjectId(Long projectId);
void saveBatch(List<ProjectProductInfo> addList);
}

View File

@ -0,0 +1,66 @@
package com.ruoyi.sip.mapper;
import java.util.List;
import com.ruoyi.sip.domain.ProjectWorkProgress;
/**
* Mapper
*
* @author ruoyi
* @date 2025-05-29
*/
public interface ProjectWorkProgressMapper
{
/**
*
*
* @param id
* @return
*/
public ProjectWorkProgress selectProjectWorkProgressById(Long id);
/**
*
*
* @param projectWorkProgress
* @return
*/
public List<ProjectWorkProgress> selectProjectWorkProgressList(ProjectWorkProgress projectWorkProgress);
/**
*
*
* @param projectWorkProgress
* @return
*/
public int insertProjectWorkProgress(ProjectWorkProgress projectWorkProgress);
/**
*
*
* @param projectWorkProgress
* @return
*/
public int updateProjectWorkProgress(ProjectWorkProgress projectWorkProgress);
/**
*
*
* @param id
* @return
*/
public int deleteProjectWorkProgressById(Long id);
/**
*
*
* @param ids
* @return
*/
public int deleteProjectWorkProgressByIds(String[] ids);
List<ProjectWorkProgress> selectProjectWorkProgressListByProjectId(Long projectId);
void insertIgnoreBatch(List<ProjectWorkProgress> projectWorkProgressList);
}

View File

@ -0,0 +1,61 @@
package com.ruoyi.sip.service;
import java.util.List;
import com.ruoyi.sip.domain.ProjectInfo;
/**
* Service
*
* @author ruoyi
* @date 2025-05-29
*/
public interface IProjectInfoService
{
/**
*
*
* @param id
* @return
*/
public ProjectInfo selectProjectInfoById(Long id);
/**
*
*
* @param projectInfo
* @return
*/
public List<ProjectInfo> selectProjectInfoList(ProjectInfo projectInfo);
/**
*
*
* @param projectInfo
* @return
*/
public int insertProjectInfo(ProjectInfo projectInfo);
/**
*
*
* @param projectInfo
* @return
*/
public int updateProjectInfo(ProjectInfo projectInfo);
/**
*
*
* @param ids
* @return
*/
public int deleteProjectInfoByIds(String ids);
/**
*
*
* @param id
* @return
*/
public int deleteProjectInfoById(Long id);
}

View File

@ -0,0 +1,63 @@
package com.ruoyi.sip.service;
import java.util.List;
import com.ruoyi.sip.domain.ProjectOperateLog;
/**
* Service
*
* @author ruoyi
* @date 2025-05-29
*/
public interface IProjectOperateLogService
{
/**
*
*
* @param id
* @return
*/
public ProjectOperateLog selectProjectOperateLogById(Long id);
/**
*
*
* @param projectOperateLog
* @return
*/
public List<ProjectOperateLog> selectProjectOperateLogList(ProjectOperateLog projectOperateLog);
/**
*
*
* @param projectOperateLog
* @return
*/
public int insertProjectOperateLog(ProjectOperateLog projectOperateLog);
/**
*
*
* @param projectOperateLog
* @return
*/
public int updateProjectOperateLog(ProjectOperateLog projectOperateLog);
/**
*
*
* @param ids
* @return
*/
public int deleteProjectOperateLogByIds(String ids);
/**
*
*
* @param id
* @return
*/
public int deleteProjectOperateLogById(Long id);
List<ProjectOperateLog> selectProjectOperateLogListByProjectId(Long id);
}

View File

@ -0,0 +1,65 @@
package com.ruoyi.sip.service;
import java.util.List;
import com.ruoyi.sip.domain.ProjectProductInfo;
/**
* Service
*
* @author ruoyi
* @date 2025-05-29
*/
public interface IProjectProductInfoService
{
/**
*
*
* @param id
* @return
*/
public ProjectProductInfo selectProjectProductInfoById(Long id);
/**
*
*
* @param projectProductInfo
* @return
*/
public List<ProjectProductInfo> selectProjectProductInfoList(ProjectProductInfo projectProductInfo);
/**
*
*
* @param projectProductInfo
* @return
*/
public int insertProjectProductInfo(ProjectProductInfo projectProductInfo);
/**
*
*
* @param projectProductInfo
* @return
*/
public int updateProjectProductInfo(ProjectProductInfo projectProductInfo);
/**
*
*
* @param ids
* @return
*/
public int deleteProjectProductInfoByIds(String ids);
/**
*
*
* @param id
* @return
*/
public int deleteProjectProductInfoById(Long id);
List<ProjectProductInfo> selectProjectProductInfoListByProjectId(Long projectId);
void saveBatch(List<ProjectProductInfo> addList);
}

View File

@ -0,0 +1,65 @@
package com.ruoyi.sip.service;
import java.util.List;
import com.ruoyi.sip.domain.ProjectWorkProgress;
/**
* Service
*
* @author ruoyi
* @date 2025-05-29
*/
public interface IProjectWorkProgressService
{
/**
*
*
* @param id
* @return
*/
public ProjectWorkProgress selectProjectWorkProgressById(Long id);
/**
*
*
* @param projectWorkProgress
* @return
*/
public List<ProjectWorkProgress> selectProjectWorkProgressList(ProjectWorkProgress projectWorkProgress);
/**
*
*
* @param projectWorkProgress
* @return
*/
public int insertProjectWorkProgress(ProjectWorkProgress projectWorkProgress);
/**
*
*
* @param projectWorkProgress
* @return
*/
public int updateProjectWorkProgress(ProjectWorkProgress projectWorkProgress);
/**
*
*
* @param ids
* @return
*/
public int deleteProjectWorkProgressByIds(String ids);
/**
*
*
* @param id
* @return
*/
public int deleteProjectWorkProgressById(Long id);
List<ProjectWorkProgress> selectProjectWorkProgressListByProjectId(Long projectId);
void insertIgnoreBatch(List<ProjectWorkProgress> projectWorkProgressList);
}

View File

@ -279,9 +279,7 @@ public class OrderInfoServiceImpl implements IOrderInfoService
}
BigDecimal amount = orderList.getPrice().multiply(new BigDecimal(orderList.getQuantity()));
if (orderList.getDiscount()!=null){
amount = amount.multiply(orderList.getDiscount()).setScale(2, RoundingMode.HALF_UP);
}
amount = amount.multiply(orderList.getDiscount()).setScale(2, RoundingMode.HALF_UP);
orderList.setAmount(amount);
}
orderInfoMapper.deleteOrderListByOrderId(orderId);

View File

@ -0,0 +1,212 @@
package com.ruoyi.sip.service.impl;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import cn.hutool.core.collection.CollUtil;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.sip.domain.*;
import com.ruoyi.sip.service.IProjectOperateLogService;
import com.ruoyi.sip.service.IProjectProductInfoService;
import com.ruoyi.sip.service.IProjectWorkProgressService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.sip.mapper.ProjectInfoMapper;
import com.ruoyi.sip.service.IProjectInfoService;
import com.ruoyi.common.core.text.Convert;
/**
* Service
*
* @author ruoyi
* @date 2025-05-29
*/
@Service
public class ProjectInfoServiceImpl implements IProjectInfoService {
@Autowired
private ProjectInfoMapper projectInfoMapper;
@Autowired
private IProjectProductInfoService productInfoService;
@Autowired
private IProjectWorkProgressService workProgressService;
@Autowired
private IProjectOperateLogService operateLogService;
private static final String PROJECT_CODE_PREFIX = "V";
private static final Integer PROJECT_CODE_LENGTH = 5;
/**
*
*
* @param id
* @return
*/
@Override
public ProjectInfo selectProjectInfoById(Long id) {
ProjectInfo projectInfo = projectInfoMapper.selectProjectInfoById(id);
//查询产品信息
List<ProjectProductInfo> projectProductInfos = productInfoService.selectProjectProductInfoListByProjectId(projectInfo.getId());
Map<String, List<ProjectProductInfo>> productListMap = projectProductInfos.stream().collect(Collectors.groupingBy(ProjectProductInfo::getType, Collectors.toList()));
projectInfo.setHardwareProjectProductInfoList(productListMap.get(ProductInfo.ProductTypeEnum.HARDWARE.getType()));
projectInfo.setSoftwareProjectProductInfoList(productListMap.get(ProductInfo.ProductTypeEnum.SOFTWARE.getType()));
//查询变更记录信息
List<ProjectWorkProgress> projectWorkProgresses = workProgressService.selectProjectWorkProgressListByProjectId((projectInfo.getId()));
projectInfo.setProjectWorkProgressList(projectWorkProgresses);
//查询操作日志信息
List<ProjectOperateLog> projectOperateLogs = operateLogService.selectProjectOperateLogListByProjectId(projectInfo.getId());
projectInfo.setProjectOperateLogList(projectOperateLogs);
return projectInfo;
}
/**
*
*
* @param projectInfo
* @return
*/
@Override
public List<ProjectInfo> selectProjectInfoList(ProjectInfo projectInfo) {
return projectInfoMapper.selectProjectInfoList(projectInfo);
}
/**
*
*
* @param projectInfo
* @return
*/
@Override
public int insertProjectInfo(ProjectInfo projectInfo) {
//生成项目编码
String s = projectInfoMapper.selectMaxProjectCode(projectInfo);
if (s == null) {
projectInfo.setProjectCode(PROJECT_CODE_PREFIX + "00001");
}else{
projectInfo.setProjectCode(PROJECT_CODE_PREFIX + String.format("%0" + PROJECT_CODE_LENGTH + "d",
Integer.parseInt(s.substring(PROJECT_CODE_PREFIX.length())) + 1));
}
projectInfo.setCreateTime(DateUtils.getNowDate());
projectInfo.setCreateBy(ShiroUtils.getUserId().toString());
int i = projectInfoMapper.insertProjectInfo(projectInfo);
//插入产品信息
List<ProjectProductInfo> hardwareProjectProductInfoList = projectInfo.getHardwareProjectProductInfoList();
List<ProjectProductInfo> softwareProjectProductInfoList = projectInfo.getSoftwareProjectProductInfoList();
List<ProjectProductInfo> addList=new ArrayList<>();
addList.addAll(hardwareProjectProductInfoList);
addList.addAll(softwareProjectProductInfoList);
if (CollUtil.isNotEmpty(addList)){
for (ProjectProductInfo projectProductInfo : addList) {
projectProductInfo.setProjectId(projectInfo.getId());
}
productInfoService.saveBatch(addList);
}
//插入变更记录信息
List<ProjectWorkProgress> projectWorkProgressList = projectInfo.getProjectWorkProgressList();
if (CollUtil.isNotEmpty(projectWorkProgressList)) {
for (ProjectWorkProgress workProgress : projectWorkProgressList) {
workProgress.setProjectId(projectInfo.getId());
}
workProgressService.insertIgnoreBatch(projectWorkProgressList);
}
return i;
}
/**
*
*
* @param projectInfo
* @return
*/
@Override
public int updateProjectInfo(ProjectInfo projectInfo) {
// 获取更新前的项目信息
ProjectInfo oldProjectInfo = projectInfoMapper.selectProjectInfoById(projectInfo.getId());
// 更新项目信息
projectInfo.setUpdateTime(DateUtils.getNowDate());
int result = projectInfoMapper.updateProjectInfo(projectInfo);
// 记录操作日志
StringBuilder logContent = new StringBuilder();
int logIndex = 1;
// 比较字段差异
compareField(logContent, logIndex++, "项目名称", oldProjectInfo.getProjectName(), projectInfo.getProjectName());
compareField(logContent, logIndex++, "客户名称", oldProjectInfo.getCustomerName(), projectInfo.getCustomerName());
compareField(logContent, logIndex++, "行业", oldProjectInfo.getIndustryType(), projectInfo.getIndustryType());
compareField(logContent, logIndex++, "属地", oldProjectInfo.getProvince(), projectInfo.getProvince());
compareField(logContent, logIndex++, "项目阶段", oldProjectInfo.getProjectStage(), projectInfo.getProjectStage());
compareField(logContent, logIndex++, "项目把握度", oldProjectInfo.getProjectGraspDegree(), projectInfo.getProjectGraspDegree());
compareField(logContent, logIndex++, "汇智支撑人员", oldProjectInfo.getHzSupportUser(), projectInfo.getHzSupportUser());
compareField(logContent, logIndex++, "运作机构", oldProjectInfo.getOperateInstitution(), projectInfo.getOperateInstitution());
compareField(logContent, logIndex++, "代理商", oldProjectInfo.getOperateInstitution(), projectInfo.getOperateInstitution());
compareField(logContent, logIndex++, "竞争对手", oldProjectInfo.getCompetitor(), projectInfo.getCompetitor());
// compareField(logContent, logIndex++, "项目类型", oldProjectInfo.getProjectType(), projectInfo.getProjectType());
// compareField(logContent, logIndex++, "项目状态", oldProjectInfo.getProjectStatus(), projectInfo.getProjectStatus());
// compareField(logContent, logIndex++, "项目经理", oldProjectInfo.getProjectManager(), projectInfo.getProjectManager());
// compareField(logContent, logIndex++, "预期收益", oldProjectInfo.getExpectedRevenue(), projectInfo.getExpectedRevenue());
// compareField(logContent, logIndex++, "实际收益", oldProjectInfo.getActualRevenue(), projectInfo.getActualRevenue());
// compareField(logContent, logIndex++, "开始日期", oldProjectInfo.getStartDate(), projectInfo.getStartDate());
// compareField(logContent, logIndex++, "结束日期", oldProjectInfo.getEndDate(), projectInfo.getEndDate());
// compareField(logContent, logIndex++, "风险等级", oldProjectInfo.getRiskLevel(), projectInfo.getRiskLevel());
// compareField(logContent, logIndex++, "备注", oldProjectInfo.getRemarks(), projectInfo.getRemarks());
// 插入操作日志
if (logContent.length() > 0) {
ProjectOperateLog operateLog = new ProjectOperateLog();
operateLog.setProjectId(projectInfo.getId());
operateLog.setOperateLog(logContent.toString());
operateLog.setOperateTime(DateUtils.getNowDate());
operateLog.setOperateUser(ShiroUtils.getUserId().toString());
operateLogService.insertProjectOperateLog(operateLog);
}
return result;
}
/**
*
*
* @param logContent
* @param index
* @param fieldName
* @param oldValue
* @param newValue
*/
private void compareField(StringBuilder logContent, int index, String fieldName, Object oldValue, Object newValue) {
if (!oldValue.equals(newValue)) {
logContent.append(index).append(".")
.append(fieldName)
.append("由‘")
.append(oldValue)
.append("’变更为‘")
.append(newValue)
.append("\n");
}
}
/**
*
*
* @param ids
* @return
*/
@Override
public int deleteProjectInfoByIds(String ids) {
return projectInfoMapper.deleteProjectInfoByIds(Convert.toStrArray(ids));
}
/**
*
*
* @param id
* @return
*/
@Override
public int deleteProjectInfoById(Long id) {
return projectInfoMapper.deleteProjectInfoById(id);
}
}

View File

@ -0,0 +1,100 @@
package com.ruoyi.sip.service.impl;
import java.util.Collections;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.sip.mapper.ProjectOperateLogMapper;
import com.ruoyi.sip.domain.ProjectOperateLog;
import com.ruoyi.sip.service.IProjectOperateLogService;
import com.ruoyi.common.core.text.Convert;
/**
* Service
*
* @author ruoyi
* @date 2025-05-29
*/
@Service
public class ProjectOperateLogServiceImpl implements IProjectOperateLogService
{
@Autowired
private ProjectOperateLogMapper projectOperateLogMapper;
/**
*
*
* @param id
* @return
*/
@Override
public ProjectOperateLog selectProjectOperateLogById(Long id)
{
return projectOperateLogMapper.selectProjectOperateLogById(id);
}
/**
*
*
* @param projectOperateLog
* @return
*/
@Override
public List<ProjectOperateLog> selectProjectOperateLogList(ProjectOperateLog projectOperateLog)
{
return projectOperateLogMapper.selectProjectOperateLogList(projectOperateLog);
}
/**
*
*
* @param projectOperateLog
* @return
*/
@Override
public int insertProjectOperateLog(ProjectOperateLog projectOperateLog)
{
return projectOperateLogMapper.insertProjectOperateLog(projectOperateLog);
}
/**
*
*
* @param projectOperateLog
* @return
*/
@Override
public int updateProjectOperateLog(ProjectOperateLog projectOperateLog)
{
return projectOperateLogMapper.updateProjectOperateLog(projectOperateLog);
}
/**
*
*
* @param ids
* @return
*/
@Override
public int deleteProjectOperateLogByIds(String ids)
{
return projectOperateLogMapper.deleteProjectOperateLogByIds(Convert.toStrArray(ids));
}
/**
*
*
* @param id
* @return
*/
@Override
public int deleteProjectOperateLogById(Long id)
{
return projectOperateLogMapper.deleteProjectOperateLogById(id);
}
@Override
public List<ProjectOperateLog> selectProjectOperateLogListByProjectId(Long id) {
return projectOperateLogMapper.selectProjectOperateLogListByProjectId(id);
}
}

View File

@ -0,0 +1,113 @@
package com.ruoyi.sip.service.impl;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.sip.mapper.ProjectProductInfoMapper;
import com.ruoyi.sip.domain.ProjectProductInfo;
import com.ruoyi.sip.service.IProjectProductInfoService;
import com.ruoyi.common.core.text.Convert;
/**
* Service
*
* @author ruoyi
* @date 2025-05-29
*/
@Service
public class ProjectProductInfoServiceImpl implements IProjectProductInfoService {
@Autowired
private ProjectProductInfoMapper projectProductInfoMapper;
/**
*
*
* @param id
* @return
*/
@Override
public ProjectProductInfo selectProjectProductInfoById(Long id) {
return projectProductInfoMapper.selectProjectProductInfoById(id);
}
/**
*
*
* @param projectProductInfo
* @return
*/
@Override
public List<ProjectProductInfo> selectProjectProductInfoList(ProjectProductInfo projectProductInfo) {
return projectProductInfoMapper.selectProjectProductInfoList(projectProductInfo);
}
/**
*
*
* @param projectProductInfo
* @return
*/
@Override
public int insertProjectProductInfo(ProjectProductInfo projectProductInfo) {
return projectProductInfoMapper.insertProjectProductInfo(projectProductInfo);
}
/**
*
*
* @param projectProductInfo
* @return
*/
@Override
public int updateProjectProductInfo(ProjectProductInfo projectProductInfo) {
return projectProductInfoMapper.updateProjectProductInfo(projectProductInfo);
}
/**
*
*
* @param ids
* @return
*/
@Override
public int deleteProjectProductInfoByIds(String ids) {
return projectProductInfoMapper.deleteProjectProductInfoByIds(Convert.toStrArray(ids));
}
/**
*
*
* @param id
* @return
*/
@Override
public int deleteProjectProductInfoById(Long id) {
return projectProductInfoMapper.deleteProjectProductInfoById(id);
}
@Override
public List<ProjectProductInfo> selectProjectProductInfoListByProjectId(Long projectId) {
return projectProductInfoMapper.selectProjectProductInfoListByProjectId(projectId);
}
@Override
public void saveBatch(List<ProjectProductInfo> addList) {
List<ProjectProductInfo> projectProductInfos = projectProductInfoMapper.selectProjectProductInfoListByProjectId(addList.get(0).getProjectId());
Set<Long> idSet = addList.stream().map(ProjectProductInfo::getId).collect(Collectors.toSet());
String[] deleteIds = projectProductInfos.stream().filter(item -> !idSet.contains(item.getId())).map(item -> item.getId().toString()).toArray(String[]::new);
//删除数据
if (deleteIds.length > 0) {
projectProductInfoMapper.deleteProjectProductInfoByIds(deleteIds);
}
//新增数据
projectProductInfoMapper.saveBatch(addList);
//todo 记录变更信息
}
}

View File

@ -0,0 +1,105 @@
package com.ruoyi.sip.service.impl;
import java.util.Collections;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.sip.mapper.ProjectWorkProgressMapper;
import com.ruoyi.sip.domain.ProjectWorkProgress;
import com.ruoyi.sip.service.IProjectWorkProgressService;
import com.ruoyi.common.core.text.Convert;
/**
* Service
*
* @author ruoyi
* @date 2025-05-29
*/
@Service
public class ProjectWorkProgressServiceImpl implements IProjectWorkProgressService
{
@Autowired
private ProjectWorkProgressMapper projectWorkProgressMapper;
/**
*
*
* @param id
* @return
*/
@Override
public ProjectWorkProgress selectProjectWorkProgressById(Long id)
{
return projectWorkProgressMapper.selectProjectWorkProgressById(id);
}
/**
*
*
* @param projectWorkProgress
* @return
*/
@Override
public List<ProjectWorkProgress> selectProjectWorkProgressList(ProjectWorkProgress projectWorkProgress)
{
return projectWorkProgressMapper.selectProjectWorkProgressList(projectWorkProgress);
}
/**
*
*
* @param projectWorkProgress
* @return
*/
@Override
public int insertProjectWorkProgress(ProjectWorkProgress projectWorkProgress)
{
return projectWorkProgressMapper.insertProjectWorkProgress(projectWorkProgress);
}
/**
*
*
* @param projectWorkProgress
* @return
*/
@Override
public int updateProjectWorkProgress(ProjectWorkProgress projectWorkProgress)
{
return projectWorkProgressMapper.updateProjectWorkProgress(projectWorkProgress);
}
/**
*
*
* @param ids
* @return
*/
@Override
public int deleteProjectWorkProgressByIds(String ids)
{
return projectWorkProgressMapper.deleteProjectWorkProgressByIds(Convert.toStrArray(ids));
}
/**
*
*
* @param id
* @return
*/
@Override
public int deleteProjectWorkProgressById(Long id)
{
return projectWorkProgressMapper.deleteProjectWorkProgressById(id);
}
@Override
public List<ProjectWorkProgress> selectProjectWorkProgressListByProjectId(Long projectId) {
return projectWorkProgressMapper.selectProjectWorkProgressListByProjectId(projectId);
}
@Override
public void insertIgnoreBatch(List<ProjectWorkProgress> projectWorkProgressList) {
projectWorkProgressMapper.insertIgnoreBatch(projectWorkProgressList);
}
}

View File

@ -43,6 +43,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="deliveryType != null and deliveryType != ''"> and t1.delivery_type = #{deliveryType}</if>
<if test="logisticsCompany != null and logisticsCompany != ''"> and t1.logistics_company = #{logisticsCompany}</if>
<if test="deliveryStatus != null and deliveryStatus != ''"> and t1.delivery_status = #{deliveryStatus}</if>
<if test="orderName != null and orderName != ''"> and t2.order_name like concat('%', #{orderName},'%')</if>
</where>
order by t1.order_id,t1.delivery_date
</select>

View File

@ -0,0 +1,178 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.sip.mapper.ProjectInfoMapper">
<resultMap type="ProjectInfo" id="ProjectInfoResult">
<result property="id" column="id" />
<result property="projectCode" column="project_code" />
<result property="projectName" column="project_name" />
<result property="customerCode" column="customer_code" />
<result property="customerName" column="customer_name" />
<result property="industryType" column="industry_type" />
<result property="province" column="province" />
<result property="projectStage" column="project_stage" />
<result property="projectGraspDegree" column="project_grasp_degree" />
<result property="hzSupportUser" column="hz_support_user" />
<result property="operateInstitution" column="operate_institution" />
<result property="partnerCode" column="partner_code" />
<result property="contactWay" column="contact_way" />
<result property="estimatedAmount" column="estimated_amount" />
<result property="currencyType" column="currency_type" />
<result property="estimatedOrderTime" column="estimated_order_time" />
<result property="estimatedDeliverTime" column="estimated_deliver_time" />
<result property="competitor" column="competitor" />
<result property="countryProduct" column="country_product" />
<result property="serverConfiguration" column="server_configuration" />
<result property="keyProblem" column="key_problem" />
<result property="projectDesc" column="project_desc" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
</resultMap>
<sql id="selectProjectInfoVo">
select id, project_code, project_name, customer_code, customer_name, industry_type, province, project_stage, project_grasp_degree, hz_support_user, operate_institution, partner_code, contact_way, estimated_amount, currency_type, estimated_order_time, estimated_deliver_time, competitor, country_product, server_configuration, key_problem, project_desc, create_by, create_time, update_by, update_time from project_info
</sql>
<select id="selectProjectInfoList" parameterType="ProjectInfo" resultMap="ProjectInfoResult">
<include refid="selectProjectInfoVo"/>
<where>
<if test="projectCode != null and projectCode != ''"> and project_code = #{projectCode}</if>
<if test="projectName != null and projectName != ''"> and project_name like concat('%', #{projectName}, '%')</if>
<if test="customerCode != null and customerCode != ''"> and customer_code = #{customerCode}</if>
<if test="customerName != null and customerName != ''"> and customer_name like concat('%', #{customerName}, '%')</if>
<if test="industryType != null and industryType != ''"> and industry_type = #{industryType}</if>
<if test="province != null and province != ''"> and province = #{province}</if>
<if test="projectStage != null and projectStage != ''"> and project_stage = #{projectStage}</if>
<if test="projectGraspDegree != null and projectGraspDegree != ''"> and project_grasp_degree = #{projectGraspDegree}</if>
<if test="hzSupportUser != null and hzSupportUser != ''"> and hz_support_user = #{hzSupportUser}</if>
<if test="operateInstitution != null and operateInstitution != ''"> and operate_institution = #{operateInstitution}</if>
<if test="partnerCode != null and partnerCode != ''"> and partner_code = #{partnerCode}</if>
<if test="contactWay != null and contactWay != ''"> and contact_way = #{contactWay}</if>
<if test="estimatedAmount != null "> and estimated_amount = #{estimatedAmount}</if>
<if test="currencyType != null and currencyType != ''"> and currency_type = #{currencyType}</if>
<if test="estimatedOrderTime != null "> and estimated_order_time = #{estimatedOrderTime}</if>
<if test="estimatedDeliverTime != null "> and estimated_deliver_time = #{estimatedDeliverTime}</if>
<if test="competitor != null and competitor != ''"> and competitor = #{competitor}</if>
<if test="countryProduct != null and countryProduct != ''"> and country_product = #{countryProduct}</if>
<if test="serverConfiguration != null and serverConfiguration != ''"> and server_configuration = #{serverConfiguration}</if>
<if test="keyProblem != null and keyProblem != ''"> and key_problem = #{keyProblem}</if>
<if test="projectDesc != null and projectDesc != ''"> and project_desc = #{projectDesc}</if>
</where>
</select>
<select id="selectProjectInfoById" parameterType="Long" resultMap="ProjectInfoResult">
<include refid="selectProjectInfoVo"/>
where id = #{id}
</select>
<select id="selectMaxProjectCode" resultType="java.lang.String">
select project_code from project_info
where province=#{province}
order by project_code desc limit 1
</select>
<insert id="insertProjectInfo" parameterType="ProjectInfo" useGeneratedKeys="true" keyProperty="id">
insert into project_info
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="projectCode != null">project_code,</if>
<if test="projectName != null">project_name,</if>
<if test="customerCode != null">customer_code,</if>
<if test="customerName != null">customer_name,</if>
<if test="industryType != null">industry_type,</if>
<if test="province != null">province,</if>
<if test="projectStage != null">project_stage,</if>
<if test="projectGraspDegree != null">project_grasp_degree,</if>
<if test="hzSupportUser != null">hz_support_user,</if>
<if test="operateInstitution != null">operate_institution,</if>
<if test="partnerCode != null">partner_code,</if>
<if test="contactWay != null">contact_way,</if>
<if test="estimatedAmount != null">estimated_amount,</if>
<if test="currencyType != null">currency_type,</if>
<if test="estimatedOrderTime != null">estimated_order_time,</if>
<if test="estimatedDeliverTime != null">estimated_deliver_time,</if>
<if test="competitor != null">competitor,</if>
<if test="countryProduct != null">country_product,</if>
<if test="serverConfiguration != null">server_configuration,</if>
<if test="keyProblem != null">key_problem,</if>
<if test="projectDesc != null">project_desc,</if>
<if test="createBy != null">create_by,</if>
<if test="createTime != null">create_time,</if>
<if test="updateBy != null">update_by,</if>
<if test="updateTime != null">update_time,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="projectCode != null">#{projectCode},</if>
<if test="projectName != null">#{projectName},</if>
<if test="customerCode != null">#{customerCode},</if>
<if test="customerName != null">#{customerName},</if>
<if test="industryType != null">#{industryType},</if>
<if test="province != null">#{province},</if>
<if test="projectStage != null">#{projectStage},</if>
<if test="projectGraspDegree != null">#{projectGraspDegree},</if>
<if test="hzSupportUser != null">#{hzSupportUser},</if>
<if test="operateInstitution != null">#{operateInstitution},</if>
<if test="partnerCode != null">#{partnerCode},</if>
<if test="contactWay != null">#{contactWay},</if>
<if test="estimatedAmount != null">#{estimatedAmount},</if>
<if test="currencyType != null">#{currencyType},</if>
<if test="estimatedOrderTime != null">#{estimatedOrderTime},</if>
<if test="estimatedDeliverTime != null">#{estimatedDeliverTime},</if>
<if test="competitor != null">#{competitor},</if>
<if test="countryProduct != null">#{countryProduct},</if>
<if test="serverConfiguration != null">#{serverConfiguration},</if>
<if test="keyProblem != null">#{keyProblem},</if>
<if test="projectDesc != null">#{projectDesc},</if>
<if test="createBy != null">#{createBy},</if>
<if test="createTime != null">#{createTime},</if>
<if test="updateBy != null">#{updateBy},</if>
<if test="updateTime != null">#{updateTime},</if>
</trim>
</insert>
<update id="updateProjectInfo" parameterType="ProjectInfo">
update project_info
<trim prefix="SET" suffixOverrides=",">
<if test="projectCode != null">project_code = #{projectCode},</if>
<if test="projectName != null">project_name = #{projectName},</if>
<if test="customerCode != null">customer_code = #{customerCode},</if>
<if test="customerName != null">customer_name = #{customerName},</if>
<if test="industryType != null">industry_type = #{industryType},</if>
<if test="province != null">province = #{province},</if>
<if test="projectStage != null">project_stage = #{projectStage},</if>
<if test="projectGraspDegree != null">project_grasp_degree = #{projectGraspDegree},</if>
<if test="hzSupportUser != null">hz_support_user = #{hzSupportUser},</if>
<if test="operateInstitution != null">operate_institution = #{operateInstitution},</if>
<if test="partnerCode != null">partner_code = #{partnerCode},</if>
<if test="contactWay != null">contact_way = #{contactWay},</if>
<if test="estimatedAmount != null">estimated_amount = #{estimatedAmount},</if>
<if test="currencyType != null">currency_type = #{currencyType},</if>
<if test="estimatedOrderTime != null">estimated_order_time = #{estimatedOrderTime},</if>
<if test="estimatedDeliverTime != null">estimated_deliver_time = #{estimatedDeliverTime},</if>
<if test="competitor != null">competitor = #{competitor},</if>
<if test="countryProduct != null">country_product = #{countryProduct},</if>
<if test="serverConfiguration != null">server_configuration = #{serverConfiguration},</if>
<if test="keyProblem != null">key_problem = #{keyProblem},</if>
<if test="projectDesc != null">project_desc = #{projectDesc},</if>
<if test="createBy != null">create_by = #{createBy},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="updateBy != null">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteProjectInfoById" parameterType="Long">
delete from project_info where id = #{id}
</delete>
<delete id="deleteProjectInfoByIds" parameterType="String">
delete from project_info where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

View File

@ -0,0 +1,85 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.sip.mapper.ProjectOperateLogMapper">
<resultMap type="ProjectOperateLog" id="ProjectOperateLogResult">
<result property="id" column="id" />
<result property="operateLog" column="operate_log" />
<result property="operateUser" column="operate_user" />
<result property="operateTime" column="operate_time" />
<result property="projectId" column="project_id" />
</resultMap>
<sql id="selectProjectOperateLogVo">
select id, operate_log, operate_user, operate_time, project_id from project_operate_log
</sql>
<select id="selectProjectOperateLogList" parameterType="ProjectOperateLog" resultMap="ProjectOperateLogResult">
<include refid="selectProjectOperateLogVo"/>
<where>
<if test="operateLog != null and operateLog != ''"> and operate_log = #{operateLog}</if>
<if test="operateUser != null and operateUser != ''"> and operate_user = #{operateUser}</if>
<if test="operateTime != null "> and operate_time = #{operateTime}</if>
<if test="projectId != null "> and project_id = #{projectId}</if>
</where>
</select>
<select id="selectProjectOperateLogById" parameterType="Long" resultMap="ProjectOperateLogResult">
<include refid="selectProjectOperateLogVo"/>
where id = #{id}
</select>
<select id="selectProjectOperateLogListByProjectId" resultType="com.ruoyi.sip.domain.ProjectOperateLog">
select t1.id
, t1.operate_log
, t1.operate_user
, t1.operate_time
, t1.project_id
, t2.user_name
from project_operate_log t1
left join sys_user t2 on operate_user = t2.user_id
where t1.project_id = #{projectId}
</select>
<insert id="insertProjectOperateLog" parameterType="ProjectOperateLog">
insert into project_operate_log
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null">id,</if>
<if test="operateLog != null">operate_log,</if>
<if test="operateUser != null">operate_user,</if>
<if test="operateTime != null">operate_time,</if>
<if test="projectId != null">project_id,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">#{id},</if>
<if test="operateLog != null">#{operateLog},</if>
<if test="operateUser != null">#{operateUser},</if>
<if test="operateTime != null">#{operateTime},</if>
<if test="projectId != null">#{projectId},</if>
</trim>
</insert>
<update id="updateProjectOperateLog" parameterType="ProjectOperateLog">
update project_operate_log
<trim prefix="SET" suffixOverrides=",">
<if test="operateLog != null">operate_log = #{operateLog},</if>
<if test="operateUser != null">operate_user = #{operateUser},</if>
<if test="operateTime != null">operate_time = #{operateTime},</if>
<if test="projectId != null">project_id = #{projectId},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteProjectOperateLogById" parameterType="Long">
delete from project_operate_log where id = #{id}
</delete>
<delete id="deleteProjectOperateLogByIds" parameterType="String">
delete from project_operate_log where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

View File

@ -0,0 +1,86 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.sip.mapper.ProjectProductInfoMapper">
<resultMap type="ProjectProductInfo" id="ProjectProductInfoResult">
<result property="id" column="id" />
<result property="projectId" column="project_id" />
<result property="productCode" column="product_code" />
<result property="quantity" column="quantity" />
<result property="remark" column="remark" />
</resultMap>
<sql id="selectProjectProductInfoVo">
select id, project_id, product_code, quantity, remark from project_product_info
</sql>
<select id="selectProjectProductInfoList" parameterType="ProjectProductInfo" resultMap="ProjectProductInfoResult">
<include refid="selectProjectProductInfoVo"/>
<where>
<if test="projectId != null "> and project_id = #{projectId}</if>
<if test="productCode != null and productCode != ''"> and product_code = #{productCode}</if>
<if test="quantity != null "> and quantity = #{quantity}</if>
</where>
</select>
<select id="selectProjectProductInfoById" parameterType="Long" resultMap="ProjectProductInfoResult">
<include refid="selectProjectProductInfoVo"/>
where id = #{id}
</select>
<select id="selectProjectProductInfoListByProjectId" resultType="com.ruoyi.sip.domain.ProjectProductInfo">
select t1.id, t1.project_id, t1.product_code, t1.quantity, t1.remark
,t2.type,t2.model
from project_product_info t1
left join product_info t2 on t1.product_code=t2.product_code
where t1.project_id=#{projectId}
order by t2.type
</select>
<insert id="insertProjectProductInfo" parameterType="ProjectProductInfo" useGeneratedKeys="true" keyProperty="id">
insert into project_product_info
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="projectId != null">project_id,</if>
<if test="productCode != null">product_code,</if>
<if test="quantity != null">quantity,</if>
<if test="remark != null">remark,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="projectId != null">#{projectId},</if>
<if test="productCode != null">#{productCode},</if>
<if test="quantity != null">#{quantity},</if>
<if test="remark != null">#{remark},</if>
</trim>
</insert>
<insert id="saveBatch">
insert into project_product_info (project_id, product_code, quantity, remark) values
<foreach item="item" index="index" collection="list" separator=",">
(#{item.projectId}, #{item.productCode}, #{item.quantity}, #{item.remark})
</foreach>
on duplicate key update product_code = values(product_code), quantity = values(quantity), remark = values(remark)
</insert>
<update id="updateProjectProductInfo" parameterType="ProjectProductInfo">
update project_product_info
<trim prefix="SET" suffixOverrides=",">
<if test="projectId != null">project_id = #{projectId},</if>
<if test="productCode != null">product_code = #{productCode},</if>
<if test="quantity != null">quantity = #{quantity},</if>
<if test="remark != null">remark = #{remark},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteProjectProductInfoById" parameterType="Long">
delete from project_product_info where id = #{id}
</delete>
<delete id="deleteProjectProductInfoByIds" parameterType="String">
delete from project_product_info where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

View File

@ -0,0 +1,87 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.sip.mapper.ProjectWorkProgressMapper">
<resultMap type="ProjectWorkProgress" id="ProjectWorkProgressResult">
<result property="id" column="id" />
<result property="workContent" column="work_content" />
<result property="workUser" column="work_user" />
<result property="workTime" column="work_time" />
<result property="projectId" column="project_id" />
</resultMap>
<sql id="selectProjectWorkProgressVo">
select id, work_content, work_user, work_time, project_id from project_work_progress
</sql>
<select id="selectProjectWorkProgressList" parameterType="ProjectWorkProgress" resultMap="ProjectWorkProgressResult">
<include refid="selectProjectWorkProgressVo"/>
<where>
<if test="workContent != null and workContent != ''"> and work_content = #{workContent}</if>
<if test="workUser != null and workUser != ''"> and work_user = #{workUser}</if>
<if test="workTime != null "> and work_time = #{workTime}</if>
<if test="projectId != null "> and project_id = #{projectId}</if>
</where>
</select>
<select id="selectProjectWorkProgressById" parameterType="Long" resultMap="ProjectWorkProgressResult">
<include refid="selectProjectWorkProgressVo"/>
where id = #{id}
</select>
<select id="selectProjectWorkProgressListByProjectId"
resultMap="ProjectWorkProgressResult">
select t1.id, t1.work_content, t1.work_user, t1.work_time, t1.project_id,
t2.user_name
from project_work_progress t1
left join sys_user t2 on t1.work_user = t2.user_id
where t1.project_id = #{projectId}
order by t1.work_time
</select>
<insert id="insertProjectWorkProgress" parameterType="ProjectWorkProgress" useGeneratedKeys="true" keyProperty="id">
insert into project_work_progress
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="workContent != null">work_content,</if>
<if test="workUser != null">work_user,</if>
<if test="workTime != null">work_time,</if>
<if test="projectId != null">project_id,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="workContent != null">#{workContent},</if>
<if test="workUser != null">#{workUser},</if>
<if test="workTime != null">#{workTime},</if>
<if test="projectId != null">#{projectId},</if>
</trim>
</insert>
<insert id="insertIgnoreBatch">
insert ignore into project_work_progress (work_content, work_user, work_time, project_id) values
<foreach item="item" index="index" collection="list" separator=",">
(#{item.workContent}, #{item.workUser}, #{item.workTime}, #{item.projectId})
</foreach>
</insert>
<update id="updateProjectWorkProgress" parameterType="ProjectWorkProgress">
update project_work_progress
<trim prefix="SET" suffixOverrides=",">
<if test="workContent != null">work_content = #{workContent},</if>
<if test="workUser != null">work_user = #{workUser},</if>
<if test="workTime != null">work_time = #{workTime},</if>
<if test="projectId != null">project_id = #{projectId},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteProjectWorkProgressById" parameterType="Long">
delete from project_work_progress where id = #{id}
</delete>
<delete id="deleteProjectWorkProgressByIds" parameterType="String">
delete from project_work_progress where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>