feat(sip): 新增订单管理功能

- 添加订单管理相关的 HTML 模板文件
- 实现订单管理的前端页面,包括列表、添加和编辑功能
- 新增订单管理的后端接口和实现类
- 在项目信息中集成订单管理功能,增加生成订单的判断逻辑
master
chenhao 2025-05-30 16:27:52 +08:00
parent 1b4f6e3c93
commit 8675eb4f0e
13 changed files with 1481 additions and 6 deletions

View File

@ -53,6 +53,10 @@
{
field: 'orderCode',
title: '合同编号'
},
{
field: 'versionCode',
title: '版本号'
},
{
field: 'orderName',

View File

@ -0,0 +1,213 @@
<!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-order-add">
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label is-required">项目主键:</label>
<div class="col-sm-8">
<input name="projectId" class="form-control" type="text" required>
</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="city" 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="businessPerson" 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="businessEmail" 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="businessPhone" 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="orderCode" 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="shipmentAmount" 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="actualPurchaseAmount" 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="orderEndTime" 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="deliveryTime" 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="companyDelivery" 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="notifier" 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="notifierEmail" 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="notifierPhone" 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="duty" 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="dutyEmail" 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="dutyPhone" 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="orderChannel" 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="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="supplier" 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="remark" 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 + "project/order"
$("#form-order-add").validate({
focusCleanup: true
});
function submitHandler() {
if ($.validate.form()) {
$.operate.save(prefix + "/add", $('#form-order-add').serialize());
}
}
$("input[name='orderEndTime']").datetimepicker({
format: "yyyy-mm-dd",
minView: "month",
autoclose: true
});
$("input[name='deliveryTime']").datetimepicker({
format: "yyyy-mm-dd",
minView: "month",
autoclose: true
});
</script>
</body>
</html>

View File

@ -0,0 +1,214 @@
<!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-order-edit" th:object="${projectOrderInfo}">
<input name="id" th:field="*{id}" type="hidden">
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label is-required">项目主键:</label>
<div class="col-sm-8">
<input name="projectId" th:field="*{projectId}" class="form-control" type="text" required>
</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="city" th:field="*{city}" 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="businessPerson" th:field="*{businessPerson}" 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="businessEmail" th:field="*{businessEmail}" 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="businessPhone" th:field="*{businessPhone}" 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="orderCode" th:field="*{orderCode}" 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="shipmentAmount" th:field="*{shipmentAmount}" 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="actualPurchaseAmount" th:field="*{actualPurchaseAmount}" 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="orderEndTime" th:value="${#dates.format(projectOrderInfo.orderEndTime, '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="deliveryTime" th:value="${#dates.format(projectOrderInfo.deliveryTime, '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="companyDelivery" th:field="*{companyDelivery}" 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="notifier" th:field="*{notifier}" 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="notifierEmail" th:field="*{notifierEmail}" 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="notifierPhone" th:field="*{notifierPhone}" 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="duty" th:field="*{duty}" 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="dutyEmail" th:field="*{dutyEmail}" 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="dutyPhone" th:field="*{dutyPhone}" 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="orderChannel" th:field="*{orderChannel}" 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="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="supplier" th:field="*{supplier}" 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="remark" th:field="*{remark}" 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 + "project/order";
$("#form-order-edit").validate({
focusCleanup: true
});
function submitHandler() {
if ($.validate.form()) {
$.operate.save(prefix + "/edit", $('#form-order-edit').serialize());
}
}
$("input[name='orderEndTime']").datetimepicker({
format: "yyyy-mm-dd",
minView: "month",
autoclose: true
});
$("input[name='deliveryTime']").datetimepicker({
format: "yyyy-mm-dd",
minView: "month",
autoclose: true
});
</script>
</body>
</html>

View File

@ -0,0 +1,250 @@
<!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="projectId"/>
</li>
<li>
<label>地市:</label>
<input type="text" name="city"/>
</li>
<li>
<label>进货商商务接口人姓名:</label>
<input type="text" name="businessPerson"/>
</li>
<li>
<label>邮箱:</label>
<input type="text" name="businessEmail"/>
</li>
<li>
<label>电话:</label>
<input type="text" name="businessPhone"/>
</li>
<li>
<label>合同编号:</label>
<input type="text" name="orderCode"/>
</li>
<li>
<label>出货金额:</label>
<input type="text" name="shipmentAmount"/>
</li>
<li>
<label>实际进货金额:</label>
<input type="text" name="actualPurchaseAmount"/>
</li>
<li>
<label>执行单有效截止时间:</label>
<input type="text" class="time-input" placeholder="请选择执行单有效截止时间" name="orderEndTime"/>
</li>
<li>
<label>要求到货时间:</label>
<input type="text" class="time-input" placeholder="请选择要求到货时间" name="deliveryTime"/>
</li>
<li>
<label>公司直发:</label>
<input type="text" name="companyDelivery"/>
</li>
<li>
<label>通知人:</label>
<input type="text" name="notifier"/>
</li>
<li>
<label>通知人邮箱:</label>
<input type="text" name="notifierEmail"/>
</li>
<li>
<label>通知人电话:</label>
<input type="text" name="notifierPhone"/>
</li>
<li>
<label>责任人:</label>
<input type="text" name="duty"/>
</li>
<li>
<label>责任人邮箱:</label>
<input type="text" name="dutyEmail"/>
</li>
<li>
<label>责任人电话:</label>
<input type="text" name="dutyPhone"/>
</li>
<li>
<label>下单通路:</label>
<input type="text" name="orderChannel"/>
</li>
<li>
<label>进货商:</label>
<input type="text" name="partnerCode"/>
</li>
<li>
<label>供货商:</label>
<input type="text" name="supplier"/>
</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="product:order:add">
<i class="fa fa-plus"></i> 添加
</a>
<a class="btn btn-primary single disabled" onclick="$.operate.edit()" shiro:hasPermission="product:order:edit">
<i class="fa fa-edit"></i> 修改
</a>
<a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()" shiro:hasPermission="product:order:remove">
<i class="fa fa-remove"></i> 删除
</a>
<a class="btn btn-warning" onclick="$.table.exportExcel()" shiro:hasPermission="product:order: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('product:order:edit')}]];
var removeFlag = [[${@permission.hasPermi('product:order:remove')}]];
var prefix = ctx + "project/order";
$(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: 'projectId',
title: '项目主键'
},
{
field: 'city',
title: '地市'
},
{
field: 'businessPerson',
title: '进货商商务接口人姓名'
},
{
field: 'businessEmail',
title: '邮箱'
},
{
field: 'businessPhone',
title: '电话'
},
{
field: 'orderCode',
title: '合同编号'
},
{
field: 'currencyType',
title: '币种'
},
{
field: 'shipmentAmount',
title: '出货金额'
},
{
field: 'actualPurchaseAmount',
title: '实际进货金额'
},
{
field: 'orderEndTime',
title: '执行单有效截止时间'
},
{
field: 'deliveryTime',
title: '要求到货时间'
},
{
field: 'companyDelivery',
title: '公司直发'
},
{
field: 'notifier',
title: '通知人'
},
{
field: 'notifierEmail',
title: '通知人邮箱'
},
{
field: 'notifierPhone',
title: '通知人电话'
},
{
field: 'duty',
title: '责任人'
},
{
field: 'dutyEmail',
title: '责任人邮箱'
},
{
field: 'dutyPhone',
title: '责任人电话'
},
{
field: 'orderChannel',
title: '下单通路'
},
{
field: 'partnerCode',
title: '进货商'
},
{
field: 'supplier',
title: '供货商'
},
{
field: 'remark',
title: '其它特别说明'
},
{
field: 'orderStatus',
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.ProjectOrderInfo;
import com.ruoyi.sip.service.IProjectOrderInfoService;
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-30
*/
@Controller
@RequestMapping("/project/order")
public class ProjectOrderInfoController extends BaseController
{
private String prefix = "project/order";
@Autowired
private IProjectOrderInfoService projectOrderInfoService;
@RequiresPermissions("project:order:view")
@GetMapping()
public String order()
{
return prefix + "/order";
}
/**
*
*/
@RequiresPermissions("project:order:list")
@PostMapping("/list")
@ResponseBody
public TableDataInfo list(ProjectOrderInfo projectOrderInfo)
{
startPage();
List<ProjectOrderInfo> list = projectOrderInfoService.selectProjectOrderInfoList(projectOrderInfo);
return getDataTable(list);
}
/**
*
*/
@RequiresPermissions("project:order:export")
@Log(title = "订单管理", businessType = BusinessType.EXPORT)
@PostMapping("/export")
@ResponseBody
public AjaxResult export(ProjectOrderInfo projectOrderInfo)
{
List<ProjectOrderInfo> list = projectOrderInfoService.selectProjectOrderInfoList(projectOrderInfo);
ExcelUtil<ProjectOrderInfo> util = new ExcelUtil<ProjectOrderInfo>(ProjectOrderInfo.class);
return util.exportExcel(list, "订单管理数据");
}
/**
*
*/
@RequiresPermissions("project:order:add")
@GetMapping("/add")
public String add()
{
return prefix + "/add";
}
/**
*
*/
@RequiresPermissions("project:order:add")
@Log(title = "订单管理", businessType = BusinessType.INSERT)
@PostMapping("/add")
@ResponseBody
public AjaxResult addSave(ProjectOrderInfo projectOrderInfo)
{
return toAjax(projectOrderInfoService.insertProjectOrderInfo(projectOrderInfo));
}
/**
*
*/
@RequiresPermissions("project:order:edit")
@GetMapping("/edit/{id}")
public String edit(@PathVariable("id") Long id, ModelMap mmap)
{
ProjectOrderInfo projectOrderInfo = projectOrderInfoService.selectProjectOrderInfoById(id);
mmap.put("projectOrderInfo", projectOrderInfo);
return prefix + "/edit";
}
/**
*
*/
@RequiresPermissions("project:order:edit")
@Log(title = "订单管理", businessType = BusinessType.UPDATE)
@PostMapping("/edit")
@ResponseBody
public AjaxResult editSave(ProjectOrderInfo projectOrderInfo)
{
return toAjax(projectOrderInfoService.updateProjectOrderInfo(projectOrderInfo));
}
/**
*
*/
@RequiresPermissions("project:order:remove")
@Log(title = "订单管理", businessType = BusinessType.DELETE)
@PostMapping( "/remove")
@ResponseBody
public AjaxResult remove(String ids)
{
return toAjax(projectOrderInfoService.deleteProjectOrderInfoByIds(ids));
}
}

View File

@ -87,11 +87,17 @@ public class ProjectInfo extends BaseEntity
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@Excel(name = "预计下单时间", width = 30, dateFormat = "yyyy-MM-dd")
private Date estimatedOrderTime;
private Date estimatedOrderTimeStart;
private Date estimatedOrderTimeEnd;
/** 预计发货时间 */
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@Excel(name = "预计发货时间", width = 30, dateFormat = "yyyy-MM-dd")
private Date estimatedDeliverTime;
private Date estimatedDeliverTimeStart;
private Date estimatedDeliverTimeEnd;
private Date updateTimeStart;
private Date updateTimeEnd;
/** 竞争对手 */
@Excel(name = "竞争对手")
@ -113,6 +119,7 @@ public class ProjectInfo extends BaseEntity
@Excel(name = "项目描述")
private String projectDesc;
private Boolean highlight;
private Boolean canGenerate;
/** 软件项目产品信息 */
private List<ProjectProductInfo> softwareProjectProductInfoList;
/** 硬件项目产品信息 */

View File

@ -0,0 +1,170 @@
package com.ruoyi.sip.domain;
import java.math.BigDecimal;
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_order_info
*
* @author ruoyi
* @date 2025-05-30
*/
@Data
public class ProjectOrderInfo extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
*
*/
private Long id;
/**
*
*/
private Long projectId;
private String projectCode;
private String projectName;
private String customerName;
private String industryType;
private String province;
/**
*
*/
@Excel(name = "地市")
private String city;
/**
*
*/
@Excel(name = "进货商商务接口人姓名")
private String businessPerson;
/**
*
*/
@Excel(name = "邮箱")
private String businessEmail;
/**
*
*/
@Excel(name = "电话")
private String businessPhone;
/**
*
*/
@Excel(name = "合同编号")
private String orderCode;
/**
*
*/
@Excel(name = "币种")
private String currencyType;
/**
*
*/
@Excel(name = "出货金额")
private BigDecimal shipmentAmount;
/**
*
*/
@Excel(name = "实际进货金额")
private BigDecimal actualPurchaseAmount;
/**
*
*/
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@Excel(name = "执行单有效截止时间", width = 30, dateFormat = "yyyy-MM-dd")
private Date orderEndTime;
/**
*
*/
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@Excel(name = "要求到货时间", width = 30, dateFormat = "yyyy-MM-dd")
private Date deliveryTime;
/**
*
*/
@Excel(name = "公司直发")
private String companyDelivery;
/**
*
*/
@Excel(name = "通知人")
private String notifier;
/**
*
*/
@Excel(name = "通知人邮箱")
private String notifierEmail;
/**
*
*/
@Excel(name = "通知人电话")
private String notifierPhone;
/**
*
*/
@Excel(name = "责任人")
private String duty;
/**
*
*/
@Excel(name = "责任人邮箱")
private String dutyEmail;
/**
*
*/
@Excel(name = "责任人电话")
private String dutyPhone;
/**
*
*/
@Excel(name = "下单通路")
private String orderChannel;
/**
*
*/
@Excel(name = "进货商")
private String partnerCode;
private String partnerName;
private String level;
/**
*
*/
@Excel(name = "供货商")
private String supplier;
/**
*
*/
@Excel(name = "订单状态")
private String orderStatus;
}

View File

@ -0,0 +1,63 @@
package com.ruoyi.sip.mapper;
import java.util.List;
import com.ruoyi.sip.domain.ProjectOrderInfo;
/**
* Mapper
*
* @author ruoyi
* @date 2025-05-30
*/
public interface ProjectOrderInfoMapper
{
/**
*
*
* @param id
* @return
*/
public ProjectOrderInfo selectProjectOrderInfoById(Long id);
/**
*
*
* @param projectOrderInfo
* @return
*/
public List<ProjectOrderInfo> selectProjectOrderInfoList(ProjectOrderInfo projectOrderInfo);
/**
*
*
* @param projectOrderInfo
* @return
*/
public int insertProjectOrderInfo(ProjectOrderInfo projectOrderInfo);
/**
*
*
* @param projectOrderInfo
* @return
*/
public int updateProjectOrderInfo(ProjectOrderInfo projectOrderInfo);
/**
*
*
* @param id
* @return
*/
public int deleteProjectOrderInfoById(Long id);
/**
*
*
* @param ids
* @return
*/
public int deleteProjectOrderInfoByIds(String[] ids);
List<ProjectOrderInfo> selectProjectOrderInfoByProjectId(List<Long> projectId);
}

View File

@ -0,0 +1,71 @@
package com.ruoyi.sip.service;
import java.util.List;
import com.ruoyi.sip.domain.ProjectOrderInfo;
/**
* Service
*
* @author ruoyi
* @date 2025-05-30
*/
public interface IProjectOrderInfoService
{
/**
*
*
* @param id
* @return
*/
public ProjectOrderInfo selectProjectOrderInfoById(Long id);
/**
*
*
* @param projectOrderInfo
* @return
*/
public List<ProjectOrderInfo> selectProjectOrderInfoList(ProjectOrderInfo projectOrderInfo);
/**
*
*
* @param projectOrderInfo
* @return
*/
public int insertProjectOrderInfo(ProjectOrderInfo projectOrderInfo);
/**
*
*
* @param projectOrderInfo
* @return
*/
public int updateProjectOrderInfo(ProjectOrderInfo projectOrderInfo);
/**
*
*
* @param ids
* @return
*/
public int deleteProjectOrderInfoByIds(String ids);
/**
*
*
* @param id
* @return
*/
public int deleteProjectOrderInfoById(Long id);
/**
* projectId
* @param projectId
* @return java.util.List<com.ruoyi.sip.domain.ProjectOrderInfo>
* @author ch
* @date 2025/05/30 16:13
*/
List< ProjectOrderInfo> selectProjectOrderInfoByProjectId(List<Long> projectId);
}

View File

@ -3,15 +3,13 @@ package com.ruoyi.sip.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.DictUtils;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.sip.domain.*;
import com.ruoyi.sip.mapper.ProjectInfoMapper;
import com.ruoyi.sip.service.IProjectInfoService;
import com.ruoyi.sip.service.IProjectOperateLogService;
import com.ruoyi.sip.service.IProjectProductInfoService;
import com.ruoyi.sip.service.IProjectWorkProgressService;
import com.ruoyi.sip.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -20,6 +18,7 @@ import java.time.LocalDate;
import java.time.Period;
import java.time.ZoneId;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@ -41,6 +40,8 @@ public class ProjectInfoServiceImpl implements IProjectInfoService {
@Autowired
private IProjectOperateLogService operateLogService;
@Autowired
private IProjectOrderInfoService orderInfoService;
private static final String PROJECT_CODE_PREFIX = "V";
private static final Integer PROJECT_CODE_LENGTH = 5;
@ -80,13 +81,17 @@ public class ProjectInfoServiceImpl implements IProjectInfoService {
*/
@Override
public List<ProjectInfo> selectProjectInfoList(ProjectInfo projectInfo) {
//todo 生成订单按钮置灰查询
List<ProjectInfo> projectInfos = projectInfoMapper.selectProjectInfoList(projectInfo);
List<Long> idList = projectInfos.stream().map(ProjectInfo::getId).collect(Collectors.toList());
List<ProjectOrderInfo> projectOrderInfos = orderInfoService.selectProjectOrderInfoByProjectId(idList);
Map<Long, ProjectOrderInfo> orderInfoMap = projectOrderInfos.stream().collect(Collectors.toMap(ProjectOrderInfo::getProjectId, Function.identity(), (v1, v2) -> v1));
LocalDate now = LocalDate.now();
for (ProjectInfo info : projectInfos) {
LocalDate localDate = info.getUpdateTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
Period between = Period.between(localDate, now);
info.setHighlight(between.getMonths() >= 2);
info.setCanGenerate(orderInfoMap.get(info.getId()) == null);
}
return projectInfos;
}
@ -161,7 +166,11 @@ public class ProjectInfoServiceImpl implements IProjectInfoService {
ProjectInfo oldProjectInfo = this.selectProjectInfoById(projectInfo.getId());
//变更属地校验
if (!projectInfo.getProvince().equals(oldProjectInfo.getProvince())) {
//todo 查询订单信息 如果有抛出异常
//查询订单信息 如果有抛出异常
List<ProjectOrderInfo> projectOrderInfos = orderInfoService.selectProjectOrderInfoByProjectId(Collections.singletonList(projectInfo.getId()));
if (CollUtil.isNotEmpty(projectOrderInfos)) {
throw new ServiceException("该项目存在订单流转,无法更改属地");
}
//如果没有 变更编码 是否考虑高并发加锁
setProjectCode(projectInfo);
}

View File

@ -0,0 +1,101 @@
package com.ruoyi.sip.service.impl;
import java.util.Collections;
import java.util.List;
import cn.hutool.core.collection.CollUtil;
import com.ruoyi.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.sip.mapper.ProjectOrderInfoMapper;
import com.ruoyi.sip.domain.ProjectOrderInfo;
import com.ruoyi.sip.service.IProjectOrderInfoService;
import com.ruoyi.common.core.text.Convert;
/**
* Service
*
* @author ruoyi
* @date 2025-05-30
*/
@Service
public class ProjectOrderInfoServiceImpl implements IProjectOrderInfoService {
@Autowired
private ProjectOrderInfoMapper projectOrderInfoMapper;
/**
*
*
* @param id
* @return
*/
@Override
public ProjectOrderInfo selectProjectOrderInfoById(Long id) {
return projectOrderInfoMapper.selectProjectOrderInfoById(id);
}
/**
*
*
* @param projectOrderInfo
* @return
*/
@Override
public List<ProjectOrderInfo> selectProjectOrderInfoList(ProjectOrderInfo projectOrderInfo) {
return projectOrderInfoMapper.selectProjectOrderInfoList(projectOrderInfo);
}
/**
*
*
* @param projectOrderInfo
* @return
*/
@Override
public int insertProjectOrderInfo(ProjectOrderInfo projectOrderInfo) {
projectOrderInfo.setCreateTime(DateUtils.getNowDate());
return projectOrderInfoMapper.insertProjectOrderInfo(projectOrderInfo);
}
/**
*
*
* @param projectOrderInfo
* @return
*/
@Override
public int updateProjectOrderInfo(ProjectOrderInfo projectOrderInfo) {
projectOrderInfo.setUpdateTime(DateUtils.getNowDate());
return projectOrderInfoMapper.updateProjectOrderInfo(projectOrderInfo);
}
/**
*
*
* @param ids
* @return
*/
@Override
public int deleteProjectOrderInfoByIds(String ids) {
return projectOrderInfoMapper.deleteProjectOrderInfoByIds(Convert.toStrArray(ids));
}
/**
*
*
* @param id
* @return
*/
@Override
public int deleteProjectOrderInfoById(Long id) {
return projectOrderInfoMapper.deleteProjectOrderInfoById(id);
}
@Override
public List<ProjectOrderInfo> selectProjectOrderInfoByProjectId(List<Long> projectId) {
if (CollUtil.isNotEmpty(projectId)) {
return Collections.emptyList();
}
return projectOrderInfoMapper.selectProjectOrderInfoByProjectId(projectId);
}
}

View File

@ -58,7 +58,48 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<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="estimatedOrderTimeStart != null or estimatedOrderTimeEnd != null">
<choose>
<when test="estimatedOrderTimeStart != null">
and estimated_order_time <![CDATA[ >= ]]> #{estimatedOrderTimeStart}
</when>
<when test="estimatedOrderTimeEnd != null">
and estimated_order_time <![CDATA[ <= ]]> #{estimatedOrderTimeEnd}
</when>
<otherwise>
and estimated_order_time between #{estimatedOrderTimeStart} and #{estimatedOrderTimeEnd}
</otherwise>
</choose>
</if>
<if test="estimatedDeliverTime != null "> and estimated_deliver_time = #{estimatedDeliverTime}</if>
<if test="estimatedDeliverTimeStart != null or estimatedDeliverTimeEnd != null">
<choose>
<when test="estimatedDeliverTimeStart != null">
and estimated_deliver_time <![CDATA[ >= ]]> #{estimatedDeliverTimeStart}
</when>
<when test="estimatedDeliverTimeEnd != null">
and estimated_deliver_time <![CDATA[ <= ]]> #{estimatedDeliverTimeEnd}
</when>
<otherwise>
and estimated_deliver_time between #{estimatedDeliverTimeStart} and #{estimatedDeliverTimeEnd}
</otherwise>
</choose>
</if>
<if test="updateTimeStart != null or updateTimeEnd != null">
<choose>
<when test="updateTimeStart != null">
and update_time <![CDATA[ >= ]]> #{updateTimeStart}
</when>
<when test="updateTimeEnd != null">
and update_time <![CDATA[ <= ]]> #{updateTimeEnd}
</when>
<otherwise>
and update_time between #{updateTimeStart} and #{updateTimeEnd}
</otherwise>
</choose>
</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>

View File

@ -0,0 +1,204 @@
<?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.ProjectOrderInfoMapper">
<resultMap type="ProjectOrderInfo" id="ProjectOrderInfoResult">
<result property="id" column="id" />
<result property="projectId" column="project_id" />
<result property="city" column="city" />
<result property="businessPerson" column="business_person" />
<result property="businessEmail" column="business_email" />
<result property="businessPhone" column="business_phone" />
<result property="orderCode" column="order_code" />
<result property="currencyType" column="currencyType" />
<result property="shipmentAmount" column="shipment_amount" />
<result property="actualPurchaseAmount" column="actual_purchase_amount" />
<result property="orderEndTime" column="order_end_time" />
<result property="deliveryTime" column="delivery_time" />
<result property="companyDelivery" column="company_delivery" />
<result property="notifier" column="notifier" />
<result property="notifierEmail" column="notifier_email" />
<result property="notifierPhone" column="notifier_phone" />
<result property="duty" column="duty" />
<result property="dutyEmail" column="duty_email" />
<result property="dutyPhone" column="duty_phone" />
<result property="orderChannel" column="order_channel" />
<result property="partnerCode" column="partner_code" />
<result property="supplier" column="supplier" />
<result property="remark" column="remark" />
<result property="orderStatus" column="order_status" />
<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="selectProjectOrderInfoVo">
select id, project_id, city, business_person, business_email, business_phone, order_code, currencyType,
shipment_amount, actual_purchase_amount, order_end_time, delivery_time, company_delivery, notifier,
notifier_email, notifier_phone, duty, duty_email, duty_phone, order_channel, partner_code, supplier,
remark, order_status, create_by, create_time, update_by, update_time from project_order_info t1
</sql>
<sql id="selectProjectOrderInfoRelationVo">
select t1.id, t1.project_id, t1.city, t1.business_person, t1.business_email, t1.business_phone, t1.order_code, t1.currencyType,
t1.shipment_amount, t1.actual_purchase_amount, t1.order_end_time, t1.delivery_time, t1.company_delivery, t1.notifier,
t1.notifier_email, t1.notifier_phone, t1.duty, t1.duty_email, t1.duty_phone, t1.order_channel, t1.partner_code, t1.supplier,
t1.remark, t1.order_status, t1.create_by, t1.create_time, t1.update_by, t1.update_time
,t2.project_code,t2.project_name,t2.province,t2.customer_name,t2.industry_type
,t3.partner_name,t3.level
from project_order_info t1
left join project_info t2 on t1.project_id = t2.id
left join partner_info t3 on t1.partner_code=t3.partner_code
</sql>
<select id="selectProjectOrderInfoList" parameterType="ProjectOrderInfo" resultMap="ProjectOrderInfoResult">
<include refid="selectProjectOrderInfoRelationVo"/>
<where>
<if test="projectId != null "> and t1.project_id = #{projectId}</if>
<if test="city != null and city != ''"> and t1.city = #{city}</if>
<if test="businessPerson != null and businessPerson != ''"> and t1.business_person = #{businessPerson}</if>
<if test="businessEmail != null and businessEmail != ''"> and t1.business_email = #{businessEmail}</if>
<if test="businessPhone != null and businessPhone != ''"> and t1.business_phone = #{businessPhone}</if>
<if test="orderCode != null and orderCode != ''"> and t1.order_code = #{orderCode}</if>
<if test="currencyType != null and currencyType != ''"> and t1.currencyType = #{currencyType}</if>
<if test="shipmentAmount != null "> and t1.shipment_amount = #{shipmentAmount}</if>
<if test="actualPurchaseAmount != null "> and t1.actual_purchase_amount = #{actualPurchaseAmount}</if>
<if test="orderEndTime != null "> and t1.order_end_time = #{orderEndTime}</if>
<if test="deliveryTime != null "> and t1.delivery_time = #{deliveryTime}</if>
<if test="companyDelivery != null and companyDelivery != ''"> and t1.company_delivery = #{companyDelivery}</if>
<if test="notifier != null and notifier != ''"> and t1.notifier = #{notifier}</if>
<if test="notifierEmail != null and notifierEmail != ''"> and t1.notifier_email = #{notifierEmail}</if>
<if test="notifierPhone != null and notifierPhone != ''"> and t1.notifier_phone = #{notifierPhone}</if>
<if test="duty != null and duty != ''"> and t1.duty = #{duty}</if>
<if test="dutyEmail != null and dutyEmail != ''"> and t1.duty_email = #{dutyEmail}</if>
<if test="dutyPhone != null and dutyPhone != ''"> and t1.duty_phone = #{dutyPhone}</if>
<if test="orderChannel != null and orderChannel != ''"> and t1.order_channel = #{orderChannel}</if>
<if test="partnerCode != null and partnerCode != ''"> and t1.partner_code = #{partnerCode}</if>
<if test="supplier != null and supplier != ''"> and t1.supplier = #{supplier}</if>
<if test="orderStatus != null and orderStatus != ''"> and t1.order_status = #{orderStatus}</if>
</where>
</select>
<select id="selectProjectOrderInfoById" parameterType="Long" resultMap="ProjectOrderInfoResult">
<include refid="selectProjectOrderInfoRelationVo"/>
where t1.id = #{id}
</select>
<select id="selectProjectOrderInfoByProjectId" resultType="com.ruoyi.sip.domain.ProjectOrderInfo">
<include refid="selectProjectOrderInfoVo"/>
where t1.project_id in (
<foreach item="item" collection="list" separator=",">
#{item}
</foreach>
)
</select>
<insert id="insertProjectOrderInfo" parameterType="ProjectOrderInfo" useGeneratedKeys="true" keyProperty="id">
insert into project_order_info
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="projectId != null">project_id,</if>
<if test="city != null">city,</if>
<if test="businessPerson != null">business_person,</if>
<if test="businessEmail != null">business_email,</if>
<if test="businessPhone != null">business_phone,</if>
<if test="orderCode != null">order_code,</if>
<if test="currencyType != null">currencyType,</if>
<if test="shipmentAmount != null">shipment_amount,</if>
<if test="actualPurchaseAmount != null">actual_purchase_amount,</if>
<if test="orderEndTime != null">order_end_time,</if>
<if test="deliveryTime != null">delivery_time,</if>
<if test="companyDelivery != null">company_delivery,</if>
<if test="notifier != null">notifier,</if>
<if test="notifierEmail != null">notifier_email,</if>
<if test="notifierPhone != null">notifier_phone,</if>
<if test="duty != null">duty,</if>
<if test="dutyEmail != null">duty_email,</if>
<if test="dutyPhone != null">duty_phone,</if>
<if test="orderChannel != null">order_channel,</if>
<if test="partnerCode != null">partner_code,</if>
<if test="supplier != null">supplier,</if>
<if test="remark != null">remark,</if>
<if test="orderStatus != null">order_status,</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="projectId != null">#{projectId},</if>
<if test="city != null">#{city},</if>
<if test="businessPerson != null">#{businessPerson},</if>
<if test="businessEmail != null">#{businessEmail},</if>
<if test="businessPhone != null">#{businessPhone},</if>
<if test="orderCode != null">#{orderCode},</if>
<if test="currencyType != null">#{currencyType},</if>
<if test="shipmentAmount != null">#{shipmentAmount},</if>
<if test="actualPurchaseAmount != null">#{actualPurchaseAmount},</if>
<if test="orderEndTime != null">#{orderEndTime},</if>
<if test="deliveryTime != null">#{deliveryTime},</if>
<if test="companyDelivery != null">#{companyDelivery},</if>
<if test="notifier != null">#{notifier},</if>
<if test="notifierEmail != null">#{notifierEmail},</if>
<if test="notifierPhone != null">#{notifierPhone},</if>
<if test="duty != null">#{duty},</if>
<if test="dutyEmail != null">#{dutyEmail},</if>
<if test="dutyPhone != null">#{dutyPhone},</if>
<if test="orderChannel != null">#{orderChannel},</if>
<if test="partnerCode != null">#{partnerCode},</if>
<if test="supplier != null">#{supplier},</if>
<if test="remark != null">#{remark},</if>
<if test="orderStatus != null">#{orderStatus},</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="updateProjectOrderInfo" parameterType="ProjectOrderInfo">
update project_order_info
<trim prefix="SET" suffixOverrides=",">
<if test="projectId != null">project_id = #{projectId},</if>
<if test="city != null">city = #{city},</if>
<if test="businessPerson != null">business_person = #{businessPerson},</if>
<if test="businessEmail != null">business_email = #{businessEmail},</if>
<if test="businessPhone != null">business_phone = #{businessPhone},</if>
<if test="orderCode != null">order_code = #{orderCode},</if>
<if test="currencyType != null">currencyType = #{currencyType},</if>
<if test="shipmentAmount != null">shipment_amount = #{shipmentAmount},</if>
<if test="actualPurchaseAmount != null">actual_purchase_amount = #{actualPurchaseAmount},</if>
<if test="orderEndTime != null">order_end_time = #{orderEndTime},</if>
<if test="deliveryTime != null">delivery_time = #{deliveryTime},</if>
<if test="companyDelivery != null">company_delivery = #{companyDelivery},</if>
<if test="notifier != null">notifier = #{notifier},</if>
<if test="notifierEmail != null">notifier_email = #{notifierEmail},</if>
<if test="notifierPhone != null">notifier_phone = #{notifierPhone},</if>
<if test="duty != null">duty = #{duty},</if>
<if test="dutyEmail != null">duty_email = #{dutyEmail},</if>
<if test="dutyPhone != null">duty_phone = #{dutyPhone},</if>
<if test="orderChannel != null">order_channel = #{orderChannel},</if>
<if test="partnerCode != null">partner_code = #{partnerCode},</if>
<if test="supplier != null">supplier = #{supplier},</if>
<if test="remark != null">remark = #{remark},</if>
<if test="orderStatus != null">order_status = #{orderStatus},</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="deleteProjectOrderInfoById" parameterType="Long">
delete from project_order_info where id = #{id}
</delete>
<delete id="deleteProjectOrderInfoByIds" parameterType="String">
delete from project_order_info where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>