Browse Source

[feat]采购资料: 添加采购经理审核页面,采购主管审核页面,协调添加调整申请页面,新增供应商资料serviceImpl实现层新增调整方法updatePurchaseQuoteById,调整采购报价查询新增审核相关查询方法,采购报价各审核节点已在本测试,通过可行。修改采购报价物料子表信息,新增del_flag字段,0为正常 1为删除,添加根据采购报价单修改del_flag 为删除的方法,新增批量根据采购报价单号设备报价物料为删除标志的方法.

dev
zhangsiqi 7 months ago
parent
commit
c95979aa2e
  1. 16
      ruoyi-admin/src/main/java/com/ruoyi/purchase/controller/PurchaseQuoteChildController.java
  2. 142
      ruoyi-admin/src/main/java/com/ruoyi/purchase/controller/PurchaseQuoteController.java
  3. 112
      ruoyi-admin/src/main/java/com/ruoyi/purchase/domain/PurchaseQuote.java
  4. 114
      ruoyi-admin/src/main/java/com/ruoyi/purchase/domain/Vo/PurchaseQuoteVo.java
  5. 43
      ruoyi-admin/src/main/java/com/ruoyi/purchase/mapper/PurchaseQuoteMapper.java
  6. 4
      ruoyi-admin/src/main/java/com/ruoyi/purchase/service/IPurchaseQuoteChildService.java
  7. 22
      ruoyi-admin/src/main/java/com/ruoyi/purchase/service/IPurchaseQuoteService.java
  8. 2
      ruoyi-admin/src/main/java/com/ruoyi/purchase/service/impl/PurchaseQuoteChildServiceImpl.java
  9. 225
      ruoyi-admin/src/main/java/com/ruoyi/purchase/service/impl/PurchaseQuoteServiceImpl.java
  10. 95
      ruoyi-admin/src/main/resources/mapper/purchase/PurchaseQuoteMapper.xml
  11. 3
      ruoyi-admin/src/main/resources/mapper/system/SysSupplierMapper.xml
  12. 54
      ruoyi-admin/src/main/resources/templates/purchase/purchaseQuote/add.html
  13. 3
      ruoyi-admin/src/main/resources/templates/purchase/purchaseQuote/edit.html
  14. 69
      ruoyi-admin/src/main/resources/templates/purchase/purchaseQuote/purchaseQuote.html
  15. 329
      ruoyi-admin/src/main/resources/templates/purchase/purchaseQuote/taskCgjlVerify.html
  16. 335
      ruoyi-admin/src/main/resources/templates/purchase/purchaseQuote/taskCgzgVerify.html
  17. 318
      ruoyi-admin/src/main/resources/templates/purchase/purchaseQuote/taskModifyApply.html

16
ruoyi-admin/src/main/java/com/ruoyi/purchase/controller/PurchaseQuoteChildController.java

@ -35,7 +35,7 @@ public class PurchaseQuoteChildController extends BaseController
@Autowired
private IPurchaseQuoteChildService purchaseQuoteChildService;
@RequiresPermissions("purchase:purchaseQuoteChild:view")
// @RequiresPermissions("purchase:purchaseQuoteChild:view")
@GetMapping()
public String purchaseQuoteChild()
{
@ -45,7 +45,7 @@ public class PurchaseQuoteChildController extends BaseController
/**
* 查询采购报价单物料信息列表
*/
@RequiresPermissions("purchase:purchaseQuoteChild:list")
// @RequiresPermissions("purchase:purchaseQuoteChild:list")
@PostMapping("/list")
@ResponseBody
public TableDataInfo list(PurchaseQuoteChild purchaseQuoteChild)
@ -58,7 +58,7 @@ public class PurchaseQuoteChildController extends BaseController
/**
* 导出采购报价单物料信息列表
*/
@RequiresPermissions("purchase:purchaseQuoteChild:export")
// @RequiresPermissions("purchase:purchaseQuoteChild:export")
@Log(title = "采购报价单物料信息", businessType = BusinessType.EXPORT)
@PostMapping("/export")
@ResponseBody
@ -81,7 +81,7 @@ public class PurchaseQuoteChildController extends BaseController
/**
* 新增保存采购报价单物料信息
*/
@RequiresPermissions("purchase:purchaseQuoteChild:add")
// @RequiresPermissions("purchase:purchaseQuoteChild:add")
@Log(title = "采购报价单物料信息", businessType = BusinessType.INSERT)
@PostMapping("/add")
@ResponseBody
@ -104,7 +104,7 @@ public class PurchaseQuoteChildController extends BaseController
/**
* 修改保存采购报价单物料信息
*/
@RequiresPermissions("purchase:purchaseQuoteChild:edit")
// @RequiresPermissions("purchase:purchaseQuoteChild:edit")
@Log(title = "采购报价单物料信息", businessType = BusinessType.UPDATE)
@PostMapping("/edit")
@ResponseBody
@ -116,7 +116,7 @@ public class PurchaseQuoteChildController extends BaseController
/**
* 删除采购报价单物料信息
*/
@RequiresPermissions("purchase:purchaseQuoteChild:remove")
// @RequiresPermissions("purchase:purchaseQuoteChild:remove")
@Log(title = "采购报价单物料信息", businessType = BusinessType.DELETE)
@PostMapping( "/remove")
@ResponseBody
@ -128,7 +128,7 @@ public class PurchaseQuoteChildController extends BaseController
/**
* 作废采购报价单物料信息
*/
@RequiresPermissions("purchase:purchaseQuoteChild:cancel")
// @RequiresPermissions("purchase:purchaseQuoteChild:cancel")
@Log(title = "采购报价单物料信息", businessType = BusinessType.CANCEL)
@GetMapping( "/cancel/{id}")
@ResponseBody
@ -139,7 +139,7 @@ public class PurchaseQuoteChildController extends BaseController
/**
* 恢复采购报价单物料信息
*/
@RequiresPermissions("purchase:purchaseQuoteChild:restore")
// @RequiresPermissions("purchase:purchaseQuoteChild:restore")
@Log(title = "采购报价单物料信息", businessType = BusinessType.RESTORE)
@GetMapping( "/restore/{id}")
@ResponseBody

142
ruoyi-admin/src/main/java/com/ruoyi/purchase/controller/PurchaseQuoteController.java

@ -1,8 +1,24 @@
package com.ruoyi.purchase.controller;
import java.util.HashMap;
import java.util.List;
import com.alibaba.fastjson.JSON;
import com.ruoyi.ck.utils.Result;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.process.general.service.IProcessService;
import com.ruoyi.purchase.domain.PurchaseQuoteChild;
import com.ruoyi.purchase.domain.Vo.PurchaseQuoteVo;
import com.ruoyi.system.domain.SysSalesOrderChild;
import com.ruoyi.system.service.ISysRoleService;
import com.ruoyi.system.service.ISysUserService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@ -17,6 +33,9 @@ import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
/**
* 采购报价单Controller
*
@ -31,6 +50,20 @@ public class PurchaseQuoteController extends BaseController
@Autowired
private IPurchaseQuoteService purchaseQuoteService;
@Autowired
private ISysRoleService roleService;
@Autowired
private TaskService taskService;
@Autowired
private RuntimeService runtimeService;
@Autowired
private IProcessService processService;
@Autowired
private ISysUserService sysUserService;
@RequiresPermissions("purchase:purchaseQuote:view")
@GetMapping()
@ -48,7 +81,7 @@ public class PurchaseQuoteController extends BaseController
public TableDataInfo list(PurchaseQuote purchaseQuote)
{
startPage();
List<PurchaseQuote> list = purchaseQuoteService.selectPurchaseQuoteList(purchaseQuote);
List<PurchaseQuoteVo> list = purchaseQuoteService.selectPurchaseQuoteList(purchaseQuote);
return getDataTable(list);
}
@ -61,8 +94,8 @@ public class PurchaseQuoteController extends BaseController
@ResponseBody
public AjaxResult export(PurchaseQuote purchaseQuote)
{
List<PurchaseQuote> list = purchaseQuoteService.selectPurchaseQuoteList(purchaseQuote);
ExcelUtil<PurchaseQuote> util = new ExcelUtil<PurchaseQuote>(PurchaseQuote.class);
List<PurchaseQuoteVo> list = purchaseQuoteService.selectPurchaseQuoteList(purchaseQuote);
ExcelUtil<PurchaseQuoteVo> util = new ExcelUtil<PurchaseQuoteVo>(PurchaseQuoteVo.class);
return util.exportExcel(list, "采购报价单数据");
}
@ -84,9 +117,9 @@ public class PurchaseQuoteController extends BaseController
@ResponseBody
public AjaxResult addSave(@RequestBody PurchaseQuote purchaseQuote)
{
purchaseQuote.setAuditStatus("1");
purchaseQuote.setUseStatus("1");
purchaseQuoteService.insertPurchaseQuote(purchaseQuote);
purchaseQuote.setAuditStatus("0");
purchaseQuote.setUseStatus("0");
purchaseQuoteService.submitApply(purchaseQuote);
return AjaxResult.success();
}
@ -108,11 +141,11 @@ public class PurchaseQuoteController extends BaseController
@Log(title = "采购报价单", businessType = BusinessType.UPDATE)
@PostMapping("/edit")
@ResponseBody
public AjaxResult editSave(@RequestBody PurchaseQuote purchaseQuote)
public AjaxResult editSave(@RequestBody PurchaseQuoteVo purchaseQuote)
{
purchaseQuote.setAuditStatus("1");
purchaseQuote.setUseStatus("1");
purchaseQuoteService.updatePurchaseQuote(purchaseQuote);
purchaseQuote.setAuditStatus("0");
purchaseQuote.setUseStatus("0");
purchaseQuoteService.submitApply(purchaseQuote);
return AjaxResult.success();
}
@ -128,28 +161,89 @@ public class PurchaseQuoteController extends BaseController
return toAjax(purchaseQuoteService.deletePurchaseQuoteByIds(ids));
}
/**
* 作废采购报价单
* 加载审批弹窗
* @param taskId
* @param mmap
* @return
*/
@RequiresPermissions("purchase:purchaseQuote:cancel")
@Log(title = "采购报价单", businessType = BusinessType.CANCEL)
@GetMapping( "/cancel/{id}")
@ResponseBody
public AjaxResult cancel(@PathVariable("id") Long id){
return toAjax(purchaseQuoteService.cancelPurchaseQuoteById(id));
@GetMapping("/showVerifyDialog/{taskId}")
public String showVerifyDialog(@PathVariable("taskId") String taskId, ModelMap mmap) {
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
String processInstanceId = task.getProcessInstanceId();
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
PurchaseQuoteVo purchaseQuoteVo = purchaseQuoteService.selectPurchaseQuoteById(new Long(processInstance.getBusinessKey()));
purchaseQuoteVo.setTaskId(taskId);
mmap.put("formData", purchaseQuoteVo);
mmap.put("taskId", taskId);
String verifyName = task.getTaskDefinitionKey().substring(0, 1).toUpperCase() + task.getTaskDefinitionKey().substring(1);
return prefix + "/task" + verifyName;
}
/**
* 恢复采购报价单
* 完成任务
*
* @return
*/
@RequiresPermissions("purchase:purchaseQuote:restore")
@Log(title = "采购报价单", businessType = BusinessType.RESTORE)
@GetMapping( "/restore/{id}")
@RequestMapping(value = "/complete/{taskId}", method = {RequestMethod.POST, RequestMethod.GET})
@ResponseBody
public AjaxResult restore(@PathVariable("id")Long id)
{
return toAjax(purchaseQuoteService.restorePurchaseQuoteById(id));
public AjaxResult complete(@PathVariable("taskId") String taskId, @RequestParam(value = "saveEntity", required = false) String saveEntity,
@ModelAttribute("preloadObj") PurchaseQuoteVo purchaseQuoteVo,
@RequestParam(value ="purchaseQuoteChildLists",required = false) String purchaseQuoteChildLists, HttpServletRequest request) {
if (!StringUtils.isEmpty(purchaseQuoteChildLists)) {
purchaseQuoteVo.setPurchaseQuoteChildList(JSON.parseArray(purchaseQuoteChildLists, PurchaseQuoteChild.class));
}
boolean saveEntityBoolean = BooleanUtils.toBoolean(saveEntity);
String instanceId = purchaseQuoteVo.getInstanceId();
String instanceType = purchaseQuoteVo.getInstanceType();
boolean approvedFlag = processService.complete(taskId, instanceId, purchaseQuoteVo.getApplyTitle(),
purchaseQuoteVo.getPurchaseQuoteCode(), "purchaseQuote", new HashMap<String, Object>(), request);
SysUser sysUser = ShiroUtils.getSysUser();
if(!approvedFlag){
// 审核状态-审核拒绝
purchaseQuoteVo.setAuditStatus("2");
}
// 如果任务已结束更新业务表状态
boolean processIsFinish = processService.judgeProcessIsFinish(instanceId);
if (processIsFinish) {
// 审核通过
purchaseQuoteVo.setAuditStatus("1");
// 提交
if("submit".equals(instanceType)){
// 使用状态-是
purchaseQuoteVo.setUseStatus("1");
}
// 作废
else if("cancel".equals(instanceType)){
// 使用状态-已作废
purchaseQuoteVo.setUseStatus("2");
}
// 恢复
else if("restore".equals(instanceType)){
// 使用状态-是
purchaseQuoteVo.setUseStatus("1");
}
purchaseQuoteVo.setUseStatus("1");
}
purchaseQuoteService.updatePurchaseQuote(purchaseQuoteVo);
// 驳回申请后继续申请,可能修改表单
if (saveEntityBoolean) {
purchaseQuoteService.updatePurchaseQuoteById(purchaseQuoteVo);
return success("重新申请");
}
return success("任务已完成");
}
@ModelAttribute("/preloadObj")
public PurchaseQuoteVo getObj(@RequestParam(value = "id", required = false) Long id, HttpSession session) {
if (id != null) {
return purchaseQuoteService.selectPurchaseQuoteById(id);
}
return new PurchaseQuoteVo();
}
/**
* 作废采购报价单
*/
@PostMapping( "/getId")
@ResponseBody

112
ruoyi-admin/src/main/java/com/ruoyi/purchase/domain/PurchaseQuote.java

@ -1,5 +1,6 @@
package com.ruoyi.purchase.domain;
import java.util.Date;
import java.util.List;
import org.apache.commons.lang3.builder.ToStringBuilder;
@ -81,9 +82,53 @@ public class PurchaseQuote extends BaseEntity
private String removeFileIdStr;
private List<PurchaseQuoteChild> purchaseQuoteChildList;
/** 流程实例ID */
private String instanceId;
/** 流程实例类型 */
private String instanceType;
/** 提交流程实例ID */
private String submitInstanceId;
/** 作废流程实例ID */
private String cancelInstanceId;
/** 恢复流程实例ID */
private String restoreInstanceId;
/** 申请人 */
private String applyTitle;
/** 申请人 */
private String applyUser;
/** 申请时间 */
private Date applyTime;
private String delFlag;
public String getDelFlag() {
return delFlag;
}
public void setDelFlag(String delFlag) {
this.delFlag = delFlag;
}
private String keyword;
public String getKeyword() {
return keyword;
}
public void setKeyword(String keyword) {
this.keyword = keyword;
}
private List<PurchaseQuoteChild> purchaseQuoteChildList;
public List<PurchaseQuoteChild> getPurchaseQuoteChildList() {
return purchaseQuoteChildList;
}
@ -251,6 +296,71 @@ public class PurchaseQuote extends BaseEntity
return useStatus;
}
public String getInstanceId() {
return instanceId;
}
public void setInstanceId(String instanceId) {
this.instanceId = instanceId;
}
public String getInstanceType() {
return instanceType;
}
public void setInstanceType(String instanceType) {
this.instanceType = instanceType;
}
public String getSubmitInstanceId() {
return submitInstanceId;
}
public void setSubmitInstanceId(String submitInstanceId) {
this.submitInstanceId = submitInstanceId;
}
public String getCancelInstanceId() {
return cancelInstanceId;
}
public void setCancelInstanceId(String cancelInstanceId) {
this.cancelInstanceId = cancelInstanceId;
}
public String getRestoreInstanceId() {
return restoreInstanceId;
}
public void setRestoreInstanceId(String restoreInstanceId) {
this.restoreInstanceId = restoreInstanceId;
}
public String getApplyTitle() {
return applyTitle;
}
public void setApplyTitle(String applyTitle) {
this.applyTitle = applyTitle;
}
public String getApplyUser() {
return applyUser;
}
public void setApplyUser(String applyUser) {
this.applyUser = applyUser;
}
public Date getApplyTime() {
return applyTime;
}
public void setApplyTime(Date applyTime) {
this.applyTime = applyTime;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

114
ruoyi-admin/src/main/java/com/ruoyi/purchase/domain/Vo/PurchaseQuoteVo.java

@ -0,0 +1,114 @@
package com.ruoyi.purchase.domain.Vo;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.purchase.domain.PurchaseQuote;
import java.util.Date;
/**
*
* @author Lenovo
* @Description BOM信息Vo
*/
public class PurchaseQuoteVo extends PurchaseQuote {
private static final long serialVersionUID = 1L;
/** 申请人姓名 */
private String applyUserName;
/** 任务ID */
private String taskId;
/** 任务名称 */
private String taskName;
/** 办理时间 */
private Date doneTime;
/** 创建人 */
private String createUserName;
/** 流程实例状态 1 激活 2 挂起 */
private String suspendState;
/** 待办用户id */
private String todoUserId;
/** 流程实例类型名称 */
private String instanceTypeName;
public String getApplyUserName() {
return applyUserName;
}
public void setApplyUserName(String applyUserName) {
this.applyUserName = applyUserName;
}
public String getTaskId() {
return taskId;
}
public void setTaskId(String taskId) {
this.taskId = taskId;
}
public String getTaskName() {
return taskName;
}
public void setTaskName(String taskName) {
this.taskName = taskName;
}
public Date getDoneTime() {
return doneTime;
}
public void setDoneTime(Date doneTime) {
this.doneTime = doneTime;
}
public String getCreateUserName() {
return createUserName;
}
public void setCreateUserName(String createUserName) {
this.createUserName = createUserName;
}
public String getSuspendState() {
return suspendState;
}
public void setSuspendState(String suspendState) {
this.suspendState = suspendState;
}
public String getTodoUserId() {
return todoUserId;
}
public void setTodoUserId(String todoUserId) {
this.todoUserId = todoUserId;
}
public String getInstanceTypeName() {
return instanceTypeName;
}
public void setInstanceTypeName(String instanceTypeName) {
this.instanceTypeName = instanceTypeName;
}
@Override
public String toString() {
return "PurchaseQuoteVo{" +
"applyUserName='" + applyUserName + '\'' +
", taskId='" + taskId + '\'' +
", taskName='" + taskName + '\'' +
", doneTime=" + doneTime +
", createUserName='" + createUserName + '\'' +
", suspendState='" + suspendState + '\'' +
", todoUserId='" + todoUserId + '\'' +
", instanceTypeName='" + instanceTypeName + '\'' +
"} " + super.toString();
}
}

43
ruoyi-admin/src/main/java/com/ruoyi/purchase/mapper/PurchaseQuoteMapper.java

@ -1,6 +1,7 @@
package com.ruoyi.purchase.mapper;
import java.util.List;
import com.github.pagehelper.Page;
import com.ruoyi.purchase.domain.Vo.PurchaseQuoteVo;
import com.ruoyi.purchase.domain.PurchaseQuote;
/**
@ -13,19 +14,19 @@ public interface PurchaseQuoteMapper
{
/**
* 查询采购报价单
*
*
* @param purchaseQuoteId 采购报价单ID
* @return 采购报价单
*/
public PurchaseQuote selectPurchaseQuoteById(Long purchaseQuoteId);
public PurchaseQuoteVo selectPurchaseQuoteById(Long purchaseQuoteId);
/**
* 查询采购报价单列表
*
*
* @param purchaseQuote 采购报价单
* @return 采购报价单集合
*/
public List<PurchaseQuote> selectPurchaseQuoteList(PurchaseQuote purchaseQuote);
public Page<PurchaseQuoteVo> selectPurchaseQuoteList(PurchaseQuote purchaseQuote);
/**
* 新增采购报价单
@ -74,4 +75,36 @@ public interface PurchaseQuoteMapper
* @return 结果
*/
public int restorePurchaseQuoteById(Long purchaseQuoteId);
/**
* 根据采购报价单编号删除采购报价单
* @param purchaseQuoteCode
* @return
*/
public Integer deletePurchaseQuoteByQuoteCode(String purchaseQuoteCode);
/**
* 根据采购报价单编号批量删除采购报价单
* @param purchaseQuoteCode
* @return
*/
public Integer deletePurchaseQuoteByQuoteCodes(String[] purchaseQuoteCode);
/**
* 根据采购报价单编号作废采购报价单
* @param purchaseQuoteCode
* @return
*/
public Integer cancelPurchaseQuoteByQuoteCode(String purchaseQuoteCode);
/**
* 根据采购报价单编号批量作废采购报价单
* @param purchaseQuoteCodes
* @return
*/
public Integer cancelPurchaseQuoteByQuoteCodes(String[] purchaseQuoteCodes);
}

4
ruoyi-admin/src/main/java/com/ruoyi/purchase/service/IPurchaseQuoteChildService.java

@ -1,8 +1,8 @@
package com.ruoyi.purchase.service;
import java.util.List;
import com.ruoyi.purchase.domain.PurchaseQuoteChild;
import org.springframework.transaction.annotation.Transactional;
/**
* 采购报价单物料信息Service接口
@ -14,7 +14,7 @@ public interface IPurchaseQuoteChildService
{
/**
* 查询采购报价单物料信息
*
*
* @param purchaseQuoteChildId 采购报价单物料信息ID
* @return 采购报价单物料信息
*/

22
ruoyi-admin/src/main/java/com/ruoyi/purchase/service/IPurchaseQuoteService.java

@ -1,7 +1,9 @@
package com.ruoyi.purchase.service;
import java.util.List;
import com.github.pagehelper.Page;
import com.ruoyi.purchase.domain.Vo.PurchaseQuoteVo;
import com.ruoyi.purchase.domain.PurchaseQuote;
import org.activiti.engine.runtime.ProcessInstance;
import org.springframework.transaction.annotation.Transactional;
/**
@ -14,19 +16,19 @@ public interface IPurchaseQuoteService
{
/**
* 查询采购报价单
*
*
* @param purchaseQuoteId 采购报价单ID
* @return 采购报价单
*/
public PurchaseQuote selectPurchaseQuoteById(Long purchaseQuoteId);
public PurchaseQuoteVo selectPurchaseQuoteById(Long purchaseQuoteId);
/**
* 查询采购报价单列表
*
*
* @param purchaseQuote 采购报价单
* @return 采购报价单集合
*/
public List<PurchaseQuote> selectPurchaseQuoteList(PurchaseQuote purchaseQuote);
public Page<PurchaseQuoteVo> selectPurchaseQuoteList(PurchaseQuote purchaseQuote);
/**
* 新增采购报价单
@ -62,19 +64,25 @@ public interface IPurchaseQuoteService
*/
public int deletePurchaseQuoteById(Long purchaseQuoteId);
@Transactional(rollbackFor = Exception.class)
ProcessInstance updatePurchaseQuoteById(PurchaseQuoteVo purchaseQuoteVo);
/**
* 作废采购报价单
* @param purchaseQuoteId 采购报价单ID
* @return
*/
int cancelPurchaseQuoteById(Long purchaseQuoteId);
ProcessInstance cancelPurchaseQuoteById(Long purchaseQuoteId);
@Transactional(rollbackFor = Exception.class)
ProcessInstance submitApply(PurchaseQuote purchaseQuote);
/**
* 恢复采购报价单
* @param purchaseQuoteId 采购报价单ID
* @return
*/
int restorePurchaseQuoteById(Long purchaseQuoteId);
ProcessInstance restorePurchaseQuoteById(Long purchaseQuoteId);
/**
* 生成采购报价单单号

2
ruoyi-admin/src/main/java/com/ruoyi/purchase/service/impl/PurchaseQuoteChildServiceImpl.java

@ -24,7 +24,7 @@ public class PurchaseQuoteChildServiceImpl implements IPurchaseQuoteChildService
/**
* 查询采购报价单物料信息
*
*
* @param purchaseQuoteChildId 采购报价单物料信息ID
* @return 采购报价单物料信息
*/

225
ruoyi-admin/src/main/java/com/ruoyi/purchase/service/impl/PurchaseQuoteServiceImpl.java

@ -1,13 +1,17 @@
package com.ruoyi.purchase.service.impl;
import java.util.Arrays;
import java.util.List;
import java.util.*;
import com.github.pagehelper.Page;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.page.PageDomain;
import com.ruoyi.common.core.page.TableSupport;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.service.ICommonService;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.purchase.domain.Vo.PurchaseQuoteVo;
import com.ruoyi.process.general.service.IProcessService;
import com.ruoyi.process.todoitem.mapper.BizTodoItemMapper;
import com.ruoyi.system.domain.SysAttach;
@ -18,6 +22,10 @@ import com.ruoyi.system.service.ISysAttachService;
import com.ruoyi.purchase.service.IPurchaseQuoteChildService;
import com.ruoyi.system.service.ISysRoleService;
import org.activiti.engine.TaskService;
import org.activiti.engine.impl.persistence.entity.TaskEntityImpl;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.purchase.mapper.PurchaseQuoteMapper;
@ -25,6 +33,7 @@ import com.ruoyi.purchase.domain.PurchaseQuote;
import com.ruoyi.purchase.service.IPurchaseQuoteService;
import com.ruoyi.common.core.text.Convert;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
/**
* 采购报价单Service业务层处理
@ -68,26 +77,76 @@ public class PurchaseQuoteServiceImpl implements IPurchaseQuoteService
private IPurchaseQuoteChildService purchaseQuoteChildService;
/**
* 查询采购报价单
*
*
* @param purchaseQuoteId 采购报价单ID
* @return 采购报价单
*/
@Override
public PurchaseQuote selectPurchaseQuoteById(Long purchaseQuoteId)
public PurchaseQuoteVo selectPurchaseQuoteById(Long purchaseQuoteId)
{
return purchaseQuoteMapper.selectPurchaseQuoteById(purchaseQuoteId);
}
/**
* 查询采购报价单列表
*
*
* @param purchaseQuote 采购报价单
* @return 采购报价单
*/
@Override
public List<PurchaseQuote> selectPurchaseQuoteList(PurchaseQuote purchaseQuote)
public Page<PurchaseQuoteVo> selectPurchaseQuoteList(PurchaseQuote purchaseQuote)
{
return purchaseQuoteMapper.selectPurchaseQuoteList(purchaseQuote);
PageDomain pageDomain = TableSupport.buildPageRequest();
Integer pageNum = pageDomain.getPageNum();
Integer pageSize = pageDomain.getPageSize();
Page<PurchaseQuoteVo> list = purchaseQuoteMapper.selectPurchaseQuoteList(purchaseQuote);
Page<PurchaseQuoteVo> returnList = new Page<>();
//PageHelper 仅对第一List分页有效
for(PurchaseQuoteVo purchaseQuoteVo : list){
SysUser sysUser = userMapper.selectUserByLoginName(purchaseQuoteVo.getCreateBy());
if (sysUser != null) {
purchaseQuoteVo.setCreateBy(sysUser.getUserName());
}
SysUser sysUser2 = userMapper.selectUserByLoginName(purchaseQuoteVo.getApplyUser());
if (sysUser2!=null){
purchaseQuoteVo.setApplyUserName(sysUser2.getUserName());
}
String instanceId = purchaseQuoteVo.getInstanceId();
// 当前环节
if (StringUtils.isNotBlank(instanceId)) {
List<Task> taskList = taskService.createTaskQuery()
.processInstanceId(instanceId)
// .singleResult();
.list(); // 例如请假会签,会同时拥有多个任务
if (!CollectionUtils.isEmpty(taskList)) {
TaskEntityImpl task = (TaskEntityImpl) taskList.get(0);
String taskId = task.getId();
purchaseQuoteVo.setTaskId(taskId);
// 设置待办用户
List<String> todoUserList = todoItemMapper.selectUndealTodoUserList(taskId);
if(!CollectionUtils.isEmpty(taskList)){
purchaseQuoteVo.setTodoUserId(String.join(",",todoUserList));
}
if (task.getSuspensionState() == 2) {
purchaseQuoteVo.setTaskName("已挂起");
purchaseQuoteVo.setSuspendState("2");
} else {
purchaseQuoteVo.setTaskName(task.getName());
purchaseQuoteVo.setSuspendState("1");
}
} else {
// 已办结或者已撤销
purchaseQuoteVo.setTaskName("已结束");
}
} else {
purchaseQuoteVo.setTaskName("未启动");
}
returnList.add(purchaseQuoteVo);
}
returnList.setTotal(CollectionUtils.isEmpty(list) ? 0 : list.getTotal());
returnList.setPageNum(pageNum);
returnList.setPageSize(pageSize);
return returnList;
}
/**
@ -217,31 +276,151 @@ public class PurchaseQuoteServiceImpl implements IPurchaseQuoteService
{
return purchaseQuoteMapper.deletePurchaseQuoteById(purchaseQuoteId);
}
@Override
@Transactional(rollbackFor = Exception.class)
public ProcessInstance updatePurchaseQuoteById(PurchaseQuoteVo purchaseQuoteVo) {
// 审核状态-待审核
purchaseQuoteVo.setAuditStatus("0");
SysUser user = ShiroUtils.getSysUser();
// 启动流程
String applyTitle = user.getUserName()+"发起了客户信息重新申请审批-"+ DateUtils.dateTimeNow();
String instanceType = "submit";
PurchaseQuote purchaseQuote = new PurchaseQuote();
BeanUtils.copyProperties(purchaseQuoteVo,purchaseQuote);
ProcessInstance processInstance = startProcessInstance(applyTitle,instanceType,purchaseQuote, user);
String processInstanceId = processInstance.getProcessInstanceId();
// 作废实例id
purchaseQuote.setCancelInstanceId(processInstanceId);
// 存在提交完就流程结束的情况
boolean processIsFinish = processService.judgeProcessIsFinish(processInstanceId);
if(processIsFinish){
// 审核状态-
purchaseQuote.setAuditStatus("1");
// 使用状态-
purchaseQuote.setUseStatus("1");
}
purchaseQuoteMapper.updatePurchaseQuote(purchaseQuote);
return processInstance;
}
@Override
@Transactional(rollbackFor = Exception.class)
public ProcessInstance cancelPurchaseQuoteById(Long id) {
PurchaseQuoteVo purchaseQuoteVo = (PurchaseQuoteVo) purchaseQuoteMapper.selectPurchaseQuoteById(id);
// 审核状态-待审核
purchaseQuoteVo.setAuditStatus("0");
SysUser user = ShiroUtils.getSysUser();
// 启动流程
String applyTitle = user.getUserName()+"发起了客户信息作废审批-"+ DateUtils.dateTimeNow();
String instanceType = "cancel";
PurchaseQuote purchaseQuote = new PurchaseQuote();
BeanUtils.copyProperties(purchaseQuoteVo,purchaseQuote);
ProcessInstance processInstance = startProcessInstance(applyTitle,instanceType,purchaseQuote, user);
String processInstanceId = processInstance.getProcessInstanceId();
// 作废实例id
purchaseQuote.setCancelInstanceId(processInstanceId);
// 存在提交完就流程结束的情况
boolean processIsFinish = processService.judgeProcessIsFinish(processInstanceId);
if(processIsFinish){
// 审核状态-审核通过
purchaseQuote.setAuditStatus("1");
// 使用状态-已作废
purchaseQuote.setUseStatus("2");
}
purchaseQuoteMapper.updatePurchaseQuote(purchaseQuote);
return processInstance;
}
/**
* 作废采购报价单
*
* @param purchaseQuoteId 采购报价单ID
* @return 结果
*/
@Override
public int cancelPurchaseQuoteById(Long purchaseQuoteId)
{
return purchaseQuoteMapper.cancelPurchaseQuoteById(purchaseQuoteId);
@Transactional(rollbackFor = Exception.class)
public ProcessInstance restorePurchaseQuoteById(Long id) {
PurchaseQuoteVo purchaseQuoteVo = (PurchaseQuoteVo) purchaseQuoteMapper.selectPurchaseQuoteById(id);
// 审核状态-待审核
purchaseQuoteVo.setAuditStatus("0");
SysUser user = ShiroUtils.getSysUser();
// 启动流程
String applyTitle = user.getUserName()+"发起了客户恢复审批-"+DateUtils.dateTimeNow();
String instanceType = "restore";
PurchaseQuote purchaseQuote = new PurchaseQuote();
BeanUtils.copyProperties(purchaseQuoteVo,purchaseQuote);
ProcessInstance processInstance = startProcessInstance(applyTitle,instanceType,purchaseQuote, user);
String processInstanceId = processInstance.getProcessInstanceId();
// 恢复实例id
purchaseQuote.setRestoreInstanceId(processInstanceId);
// 存在提交完就流程结束的情况
boolean processIsFinish = processService.judgeProcessIsFinish(processInstanceId);
if(processIsFinish){
// 审核状态-审核通过
purchaseQuote.setAuditStatus("1");
// 使用状态-是
purchaseQuote.setUseStatus("1");
}
purchaseQuoteMapper.updatePurchaseQuote(purchaseQuote);
return processInstance;
}
/**
* 恢复采购报价单信息
*
* @param purchaseQuoteId 采购报价单ID
* @return 结果
* 提交申请
* @param purchaseQuote
* @return
*/
@Override
public int restorePurchaseQuoteById(Long purchaseQuoteId)
{
return purchaseQuoteMapper.restorePurchaseQuoteById(purchaseQuoteId);
@Transactional(rollbackFor = Exception.class)
public ProcessInstance submitApply(PurchaseQuote purchaseQuote) {
SysUser user = ShiroUtils.getSysUser();
purchaseQuote.setApplyUser(user.getLoginName());
purchaseQuote.setApplyTime(DateUtils.getNowDate());
insertPurchaseQuote(purchaseQuote);
// 启动流程
String applyTitle = user.getUserName()+"发起了客户信息提交审批-"+DateUtils.dateTimeNow();
String instanceType = "submit";
ProcessInstance processInstance = startProcessInstance(applyTitle,instanceType,purchaseQuote, user);
String processInstanceId = processInstance.getProcessInstanceId();
// 提交实例id
purchaseQuote.setSubmitInstanceId(processInstanceId);
// 存在提交完就流程结束的情况
boolean processIsFinish = processService.judgeProcessIsFinish(processInstanceId);
if(processIsFinish){
// 审核状态-审核通过
purchaseQuote.setAuditStatus("1");
// 使用状态-是
purchaseQuote.setUseStatus("1");
}
purchaseQuoteMapper.updatePurchaseQuote(purchaseQuote);
return processInstance;
}
private ProcessInstance startProcessInstance(String applyTitle, String instanceType, PurchaseQuote purchaseQuote, SysUser user) {
Long customerId = purchaseQuote.getPurchaseQuoteId();
String businessKey = customerId.toString(); // 实体类 ID,作为流程的业务 key
String key = "purchaseQuote";
Map<String,Object> variables = new HashMap<>();
// 构造authority传参
buildAuthority(user, variables);
purchaseQuote.setApplyTitle(applyTitle);
// 启动流程
ProcessInstance processInstance = processService.submitApply(user.getLoginName(), businessKey, applyTitle,
purchaseQuote.getPurchaseQuoteCode(), key, variables);
String processInstanceId = processInstance.getId();
purchaseQuote.setInstanceId(processInstanceId); // 建立双向关系
purchaseQuote.setInstanceType(instanceType);
return processInstance;
}
private void buildAuthority(SysUser user, Map<String, Object> variables) {
Set<String> roleKeys = roleService.selectRoleKeys(user.getUserId());
if(roleKeys.contains("cgyRole")){
variables.put("authority",1);
}
// 角色不同审核人不同
if(roleKeys.contains("admin")){
variables.put("authority",2);
}
}
@Override
public Object getId(){
return redisCache.generateBillNo("CGBJ");

95
ruoyi-admin/src/main/resources/mapper/purchase/PurchaseQuoteMapper.xml

@ -3,7 +3,7 @@
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.purchase.mapper.PurchaseQuoteMapper">
<resultMap type="PurchaseQuote" id="PurchaseQuoteResult">
<resultMap type="PurchaseQuoteVo" id="PurchaseQuoteResult">
<result property="purchaseQuoteId" column="purchase_quote_id" />
<result property="purchaseQuoteCode" column="purchase_quote_code" />
<result property="purchaseBuyer" column="purchaseBuyer" />
@ -23,21 +23,33 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="remark" column="remark" />
<result property="photoAttachId" column="photo_attach_id" />
<result property="photoUrl" column="photo_url" />
<result property="instanceType" column="instance_type" />
<result property="instanceId" column="instance_id" />
<result property="restoreInstanceId" column="restore_instance_id" />
<result property="cancelInstanceId" column="cancel_instance_id" />
<result property="submitInstanceId" column="submit_instance_id" />
<result property="applyTitle" column="apply_title" />
<result property="applyUser" column="apply_user" />
<result property="applyTime" column="apply_time" />
<result property="delFlag" column="del_flag" />
</resultMap>
<sql id="selectPurchaseQuoteVo">
select purchase_quote_id, purchase_quote_code, purchaseBuyer,
supplier_quote_code, supplier_name, tax_rate, material_amount,
pricingDate, material_no,material_name, create_by, create_time, update_by, update_time,
audit_status, use_status, remark from purchase_quote
audit_status, use_status, remark,instance_type, instance_id, restore_instance_id,
cancel_instance_id, submit_instance_id, apply_title, apply_user, apply_time,del_flag from purchase_quote
</sql>
<select id="selectPurchaseQuoteList" parameterType="PurchaseQuote" resultMap="PurchaseQuoteResult">
select p.purchase_quote_id, p.purchase_quote_code, p.purchaseBuyer,
p.supplier_quote_code, p.supplier_name, p.tax_rate, p.material_amount,
p.pricingDate, p.material_no,p.material_name, p.create_by, p.create_time, p.update_by,
p.update_time,p.audit_status, p.use_status,
p.remark,file.url as photo_url from purchase_quote as p
p.update_time,p.audit_status, p.use_status,p.remark,p.instance_type, p.instance_id,
p.restore_instance_id,p.cancel_instance_id, p.submit_instance_id, p.apply_title,
p.apply_user, p.apply_time,p.del_flag,p.remark,file.url as photo_url
from purchase_quote as p
left join (
select
att.rel_id
@ -51,6 +63,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
)file
on p.purchase_quote_id = file.rel_id
<where>
and p.del_flag = '0'
<if test="purchaseQuoteCode != null and purchaseQuoteCode != ''"> and p.purchase_quote_code = #{purchaseQuoteCode}</if>
<if test="purchaseBuyer != null and purchaseBuyer != ''"> and p.purchaseBuyer = #{purchaseBuyer}</if>
<if test="supplierQuoteCode != null and supplierQuoteCode != ''"> and p.supplier_quote_code = #{supplierQuoteCode}</if>
@ -62,6 +75,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="params.beginCreateTime != null and params.beginCreateTime != '' and params.endCreateTime != null and params.endCreateTime != ''"> and p.create_time between #{params.beginCreateTime} and #{params.endCreateTime}</if>
<if test="auditStatus != null and auditStatus != ''"> and p.audit_status = #{auditStatus}</if>
<if test="useStatus != null and useStatus != ''"> and p.use_status = #{useStatus}</if>
<if test="instanceId != null and instanceId != ''"> and p.instance_id = #{instanceId}</if>
<if test="instanceType != null and instanceType != ''"> and p.instance_type = #{instanceType}</if>
<if test="submitInstanceId != null and submitInstanceId != ''"> and p.submit_instance_id = #{submitInstanceId}</if>
<if test="cancelInstanceId != null and cancelInstanceId != ''"> and p.cancel_instance_id = #{cancelInstanceId}</if>
<if test="restoreInstanceId != null and restoreInstanceId != ''"> and p.restore_instance_id = #{restoreInstanceId}</if>
<if test="applyTitle != null and applyTitle != ''"> and p.apply_title = #{applyTitle}</if>
<if test="applyUser != null and applyUser != ''"> and p.apply_user = #{applyUser}</if>
<if test="applyTime != null "> and p.apply_time = #{applyTime}</if>
<if test="params.beginCreateTime != null and params.beginCreateTime != '' and params.endCreateTime != null and params.endCreateTime != ''">
and p.create_time between #{params.beginCreateTime} and #{params.endCreateTime}
</if>
<if test="keyword != null and keyword != ''"> and p.purchase_quote_code like concat('%',#{keyword},'%')</if>
</where>
order by p.create_time desc
</select>
@ -69,8 +94,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectPurchaseQuoteById" parameterType="Long" resultMap="PurchaseQuoteResult">
select p.purchase_quote_id, p.purchase_quote_code, p.purchaseBuyer,
p.supplier_quote_code, p.supplier_name, p.tax_rate, p.material_amount,
p.pricingDate, p.material_no, p.material_name, p.create_by, p.create_time, p.update_by, p.update_time,
p.audit_status, p.use_status, p.remark,file.url as photo_url from purchase_quote as p
p.pricingDate, p.material_no, p.material_name, p.create_by, p.create_time,
p.update_by, p.update_time,p.audit_status, p.use_status, p.remark,p.instance_type,
p.instance_id, p.restore_instance_id,p.cancel_instance_id, p.submit_instance_id,
p.apply_title, p.apply_user, p.apply_time,p.del_flag,p.remark,
p.instance_type, p.instance_id, p.restore_instance_id,p.cancel_instance_id,
p.submit_instance_id, p.apply_title, p.apply_user, p.apply_time,
file.url as photo_url from purchase_quote as p
left join (
select att.rel_id,file.url,min(file.create_time) as create_time
from sys_attach as att
@ -102,6 +132,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="auditStatus != null">audit_status,</if>
<if test="useStatus != null">use_status,</if>
<if test="remark != null">remark,</if>
<if test="instanceId != null">instance_id,</if>
<if test="instanceType != null">instance_type,</if>
<if test="submitInstanceId != null">submit_instance_id,</if>
<if test="cancelInstanceId != null">cancel_instance_id,</if>
<if test="restoreInstanceId != null">restore_instance_id,</if>
<if test="applyTitle != null">apply_title,</if>
<if test="applyUser != null">apply_user,</if>
<if test="applyTime != null">apply_time,</if>
<if test="delFlag != null">del_flag,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="purchaseQuoteCode != null">#{purchaseQuoteCode},</if>
@ -120,6 +159,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="auditStatus != null">#{auditStatus},</if>
<if test="useStatus != null">#{useStatus},</if>
<if test="remark != null">#{remark},</if>
<if test="instanceId != null">#{instanceId},</if>
<if test="instanceType != null">#{instanceType},</if>
<if test="submitInstanceId != null">#{submitInstanceId},</if>
<if test="cancelInstanceId != null">#{cancelInstanceId},</if>
<if test="restoreInstanceId != null">#{restoreInstanceId},</if>
<if test="applyTitle != null">#{applyTitle},</if>
<if test="applyUser != null">#{applyUser},</if>
<if test="applyTime != null">#{applyTime},</if>
<if test="delFlag != null">#{delFlag},</if>
</trim>
</insert>
@ -142,6 +190,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="auditStatus != null">audit_status = #{auditStatus},</if>
<if test="useStatus != null">use_status = #{useStatus},</if>
<if test="remark != null">remark = #{remark},</if>
<if test="instanceId != null">instance_id = #{instanceId},</if>
<if test="instanceType != null">instance_type = #{instanceType},</if>
<if test="submitInstanceId != null">submit_instance_id = #{submitInstanceId},</if>
<if test="cancelInstanceId != null">cancel_instance_id = #{cancelInstanceId},</if>
<if test="restoreInstanceId != null">restore_instance_id = #{restoreInstanceId},</if>
<if test="applyTitle != null">apply_title = #{applyTitle},</if>
<if test="applyUser != null">apply_user = #{applyUser},</if>
<if test="applyTime != null">apply_time = #{applyTime},</if>
<if test="delFlag != null">del_flag = #{delFlag},</if>
</trim>
where purchase_quote_id = #{purchaseQuoteId}
</update>
@ -156,13 +213,33 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#{purchaseQuoteId}
</foreach>
</delete>
<update id="cancelPurchaseQuoteById" parameterType="Long">
<update id="cancelPurchaseQuoteById" parameterType="String">
update purchase_quote set del_flag = '1' where purchase_quote_id = #{purchaseQuoteId}
</update>
<update id="restorePurchaseQuoteById" parameterType="Long">
<update id="restorePurchaseQuoteById" parameterType="String">
update purchase_quote set del_flag = '0' where purchase_quote_id = #{purchaseQuoteId}
</update>
<update id="cancelPurchaseQuoteByQuoteCode" parameterType="String">
update purchase_quote set del_flag = '1' where purchase_quote_code = #{purchaseQuoteCode}
</update>
<update id="cancelPurchaseQuoteByQuoteCodes" parameterType="String">
update purchase_quote set del_flag = '1' where purchase_quote_code in
<foreach item="purchaseQuoteCode" collection="array" open="(" separator="," close=")">
#{purchaseQuoteCode}
</foreach>
</update>
<delete id="deletePurchaseQuoteByQuoteCodes" parameterType="String">
delete from purchase_quote where purchase_quote_code in
<foreach item="purchaseQuoteCode" collection="array" open="(" separator="," close=")">
#{purchaseQuoteCode}
</foreach>
</delete>
<delete id="deletePurchaseQuoteByQuoteCode" parameterType="String">
delete from purchase_quote where purchase_quote_code =
#{purchaseQuoteCode}
</delete>
</mapper>

3
ruoyi-admin/src/main/resources/mapper/system/SysSupplierMapper.xml

@ -68,7 +68,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
customer_email, website, payment_terms, supplier_days, actual_payment_days,
settlement_bank, exchange_settlement_account, deposit_bank, bank_account,
rmb_registered_capital, Industry_code, merchandiser, merchandiser_telephone,
financial_contact, confirm_tax, tax_rate, photo_attach_id, photo_url, create_by,
financial_contact, confirm_tax, tax_rate, create_by,
create_time, update_by, update_time, remark,
instance_type, instance_id, restore_instance_id, cancel_instance_id, submit_instance_id,
apply_title, apply_user, apply_time,del_flag
@ -104,6 +104,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
) as file
on sup.supplier_id = file.rel_id
<where>
del_flag = '0'
<if test="supplierCode != null and supplierCode != ''"> and sup.supplier_code like concat('%', #{supplierCode}, '%')</if>
<if test="supplierName != null and supplierName != ''"> and sup.supplier_name like concat('%', #{supplierName}, '%')</if>
<if test="supplierType != null and supplierType != ''"> and sup.supplier_type = #{supplierType}</if>

54
ruoyi-admin/src/main/resources/templates/purchase/purchaseQuote/add.html

@ -97,13 +97,14 @@
<th:block th:include="include :: bootstrap-table-editable-js" />
<th:block th:include="include :: datetimepicker-js" />
<th:block th:include="include :: select2-js" />
<script th:src="@{/js/activiti.js}"></script>
<script th:src="@{/ajax/libs/vue/vue.js}"></script>
<script th:src="@{/ajax/libs/element-ui/element-ui.js}"></script>
<script th:inline="javascript">
var materialTypeData = [[${@category.getChildByCode('materialType')}]];
var sysUnitClassData = [[${@dict.getType('sys_unit_class')}]];
var processMethodData = [[${@dict.getType('processMethod')}]];
var userName = [[${@permission.getPrincipalProperty('userName')}]];
var loginName = [[${@permission.getPrincipalProperty('loginName')}]];
var prefix = ctx + "purchase/purchaseQuote";
$("#form-purchaseOrder-add").validate({focusCleanup: true});
function getPurchaseQuoteCode(){
@ -184,7 +185,30 @@
}
};
$.table.init(options);
selectSupplier();
$('#selectSupplierQuoteCode').select2({
theme: "bootstrap",
allowClear: true,
placeholder: "请选择供应商",
ajax: {
url: ctx + "system/supplier/getSupplier",
type: "post",
dataType: "json",
delay: 250,
processResults: function (res, params) {
var resultList = res.rows;
var options = [];
for (let i in resultList) {
var option = resultList[i];
option.id = resultList[i]["supplierCode"];
option.text = resultList[i]["supplierCode"];
option.title = resultList[i]["supplierName"];
options.push(option);
}
return {results: options,}
},
escapeMarkup: function (markup) {return markup;},
}
});
getPurchaseQuoteCode();
});
function doSubmit(index, layero,uniqueId){
@ -291,32 +315,6 @@
}
});
//获取供应商
function selectSupplier(){
$('#selectSupplierQuoteCode').select2({
theme: "bootstrap",
allowClear: true,
placeholder: "请选择供应商",
ajax: {
url: ctx + "system/supplier/getSupplier",
type: "post",
dataType: "json",
delay: 250,
processResults: function (res, params) {
var resultList = res.rows;
var options = [];
for (let i in resultList) {
var option = resultList[i];
option.id = resultList[i]["supplierCode"];
option.text = resultList[i]["supplierCode"];
option.title = resultList[i]["supplierName"];
options.push(option);
}
return {results: options,}
},
escapeMarkup: function (markup) {return markup;},
}
});
}
$("#selectSupplierQuoteCode").on("select2:select",function (e) {
var dataObj = e.params.data;
console.log("dataObj",dataObj);

3
ruoyi-admin/src/main/resources/templates/purchase/purchaseQuote/edit.html

@ -94,6 +94,7 @@
<th:block th:include="include :: select2-js" />
<th:block th:include="include :: bootstrap-table-editable-js" />
<th:block th:include="include :: datetimepicker-js" />
<script th:src="@{/js/activiti.js}"></script>
<script th:src="@{/ajax/libs/vue/vue.js}"></script>
<script th:src="@{/ajax/libs/element-ui/element-ui.js}"></script>
<script th:inline="javascript">
@ -101,7 +102,7 @@
var auditStatusDatas = [[${@dict.getType('auditStatus')}]];
var sysUnitClassDatas = [[${@dict.getType('sys_unit_class')}]];
var processMethodDatas = [[${@dict.getType('processMethod')}]];
var userName = [[${@permission.getPrincipalProperty('userName')}]];
var loginName = [[${@permission.getPrincipalProperty('loginName')}]];
var prefix = ctx + "purchase/purchaseQuote";
var purchaseQuote = [[${purchaseQuote}]];
new Vue({

69
ruoyi-admin/src/main/resources/templates/purchase/purchaseQuote/purchaseQuote.html

@ -76,6 +76,10 @@
</div>
</div>
<th:block th:include="include :: footer" />
<th:block th:include="include :: select2-js" />
<th:block th:include="include :: bootstrap-table-editable-js" />
<th:block th:include="include :: datetimepicker-js" />
<script th:src="@{/js/activiti.js}"></script>
<script th:inline="javascript">
var editFlag = [[${@permission.hasPermi('purchase:purchaseQuote:edit')}]];
var removeFlag = [[${@permission.hasPermi('purchase:purchaseQuote:remove')}]];
@ -83,6 +87,7 @@
var restoreFlag = [[${@permission.hasPermi('purchase:purchaseQuote:restore')}]];
var auditStatusDatas = [[${@dict.getType('auditStatus')}]];
var useStatusDatas = [[${@dict.getType('useStatus')}]];
var loginName = [[${@permission.getPrincipalProperty('loginName')}]];
var prefix = ctx + "purchase/purchaseQuote";
$(function() {
var options = {
@ -102,6 +107,29 @@
{title: '审核状态',field: 'auditStatus',
formatter: function (value, row, index) {return $.table.selectDictLabel(auditStatusDatas, value);}
},
{title: '流程实例ID',field: 'instanceId',visible: false},
{ title: '流程提交实例ID',field: 'submitInstanceId',visible: false},
{ title:'流程作废实例ID',field: 'cancelInstanceId',visible: false},
{title: '流程恢复实例ID',field: 'restoreInstanceId', visible: false},
{ title: '流程实例类型', field: 'instanceTypeName',visible: false},
{title: '申请人ID',field: 'applyUser', visible: false},
{
field: 'applyUserName',
title: '<span style="color: red;">申请人</span>',
formatter: function(value, row, index) {
return '<span style="color: red;">' + (value ? value : "-") + '</span>';
}
},
{field: 'applyTime',title: '申请时间'
},
{title: '当前任务ID',field: 'taskId',visible: false},
{ title: '待办用户ID',field: 'todoUserId', visible: false},
{ title: '当前任务名称',field: 'taskName',
align: 'center',
formatter: function(value, row, index) {
return '<span class="badge badge-primary">' + value + '</span>';
}
},
{title: '采购员',field: 'purchaseBuyer',},
{title: '采购报价单号',field: 'purchaseQuoteCode',},
{title: '供应商ID',field: 'supplierQuoteCode',},
@ -111,16 +139,41 @@
{title: '录入时间',field: 'createTime',},
{title: '更新人',field: 'updateBy',},
{title: '上次更新时间',field: 'updateTime',},
{title: '操作',align: 'center',
formatter: function(value, row, index) {
{
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.purchaseQuoteId + '\')"><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.purchaseQuoteId + '\')"><i class="fa fa-remove"></i>删除</a> ');
if(row.delFlag == '0'){
actions.push('<a class="btn btn-danger btn-xs ' + cancelFlag + '" href="javascript:void(0)" onclick="$.operate.cancel(\'' + row.id + '\')"><i class="fa fa-remove"></i>作废</a> ');
}else{
actions.push('<a class="btn btn-success btn-xs ' + restoreFlag + '" href="javascript:void(0)" onclick="$.operate.restore(\'' + row.id + '\')"><i class="fa fa-window-restore"></i>恢复</a> ');
// 审核状态-审核通过 使用状态-是 未发起作废流程
if (row.auditStatus == "1" && row.useStatus == "1" && !row.cancelInstanceId) {
// 作废
actions.push('<a class="btn btn-danger btn-xs" href="javascript:void(0)" onclick="$.operate.cancel(\'' + row.purchaseQuoteId + '\')"><i class="fa fa-remove"></i> 作废</a>');
// 编辑
actions.push('<a class="btn btn-success btn-xs" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.purchaseQuoteId + '\')"><i class="fa fa-edit"></i> 编辑</a> ');
} else {
actions.push('<a class="btn btn-default btn-xs" disabled href="javascript:void(0)"><i class="fa fa-edit"></i> 编辑</a> ');
}
// 已作废
if (row.useStatus == "2" && !row.restoreInstanceId) {
// 恢复
actions.push('<a class="btn btn-success btn-xs" href="javascript:void(0)" onclick="$.operate.restore(\'' + row.purchaseQuoteId + '\')"><i class="fa fa-window-restore"></i> 恢复</a> ');
}
// 有流程实例id
if (row.instanceId) {
// 有待办人展示审批按钮,
if (row.todoUserId) {
var todoUserIdList = row.todoUserId.split(",");
if (todoUserIdList.includes(loginName)) {
var nodeName = row.taskName == '驳回调整' ? ' 调整申请' : ' 审批';
actions.push('<a class="btn btn-success btn-xs" href="javascript:void(0)" onclick="showVerifyDialog(\'' + prefix + '\',\'' + row.taskId + '\', \'' + row.taskName + "-" + row.instanceTypeName + "申请" + '\')"><i class="fa fa-edit"></i> ' + nodeName + '</a> ');
}
}
// 审批历史
actions.push('<a class="btn btn-warning btn-xs" href="javascript:void(0)" onclick="showHistoryDialog(\'' + row.instanceId + '\')"><i class="fa fa-list"></i> 审批历史</a> ');
// 进度查看
actions.push('<a class="btn btn-info btn-xs" href="javascript:void(0)" onclick="showProcessImgDialog(\'' + row.instanceId + '\')"><i class="fa fa-image"></i> 进度查看</a> ');
}
// 详情
actions.push('<a class="btn btn-primary btn-xs" href="javascript:void(0)" onclick="$.operate.detail(\'' + row.purchaseQuoteId + '\')"><i class="fa fa-eye"></i> 详情</a> ');
return actions.join('');
}
}

329
ruoyi-admin/src/main/resources/templates/purchase/purchaseQuote/taskCgjlVerify.html

@ -0,0 +1,329 @@
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
<head>
<th:block th:include="include :: header('采购经理审核')" />
<th:block th:include="include :: select2-css" />
<th:block th:include="include :: datetimepicker-css" />
<th:block th:include="include :: bootstrap-editable-css" />
<link th:href="@{/ajax/libs/element-ui/element-ui.css}" rel="stylesheet"/>
</head>
<body class="white-bg">
<div id="app" class="wrapper wrapper-content animated fadeInRight ibox-content">
<form class="form-horizontal m" id="form-purchaseQuote-cgjl-audit" th:object="${formData}">
<input name="purchaseQuoteId" th:field="*{purchaseQuoteId}" type="hidden">
<input name="taskId" th:field="*{taskId}" type="hidden">
<input name="taskName" th:field="*{taskName}" type="hidden">
<input name="instanceId" th:field="*{instanceId}" type="hidden">
<input name="instanceType" th:field="*{instanceType}" type="hidden">
<input type="hidden" name="p_COM_comment" />
<div class="form-group">
<label class="col-sm-3 control-label">申请人:</label>
<div class="col-sm-8">
<input name="applyUser" th:field="*{applyUser}" class="form-control" type="text" readonly>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">申请时间:</label>
<div class="col-sm-8">
<div class="input-group date">
<input name="applyTime" th:value="${#dates.format(formData.applyTime, 'yyyy-MM-dd HH:mm')}" class="form-control" type="text" disabled>
<span class="input-group-addon"><i class="fa fa-calendar"></i></span>
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">标题:</label>
<div class="col-sm-8">
<input name="title" th:field="*{applyTitle}" class="form-control" type="text" disabled>
</div>
</div>
<div class="form-group" hidden="hidden">
<label class="col-sm-3 control-label" >采购报价单号:</label>
<div class="col-sm-8">
<input id="purchaseQuoteCode_edit" name="purchaseQuoteCode" th:field="*{purchaseQuoteCode}" class="form-control" type="text" readonly>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">供应商ID:</label>
<div class="col-sm-8">
<input name="supplierQuoteCode" th:field="*{supplierQuoteCode}" class="form-control" />
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">供应商名称:</label>
<div class="col-sm-8">
<input name="supplierName" th:field="*{supplierName}" class="form-control">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">定价日期:</label>
<div class="input-group date">
<input name="pricingDate" th:field="*{pricingDate}" class="form-control" type="text">
<span class="input-group-addon"><i class="fa fa-calendar"></i></span>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">备注说明:</label>
<div class="col-sm-8">
<textarea name="remark" class="form-control" th:field="*{remark}"></textarea>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">附件:</label>
<div class="col-sm-8">
<el-upload
:action="fileUploadUrl"
:on-success="uploadSuccess"
:on-preview="handlePictureCardPreview"
:on-remove="uploadRemove"
:file-list="fileList"
:limit="5"
list-type="picture"
accept=".jpg,.png"
multiple>
<el-button size="small" type="primary">点击上传</el-button>
<div slot="tip" class="el-upload__tip">只能上传jpg/png文件,第一张图片为主图</div>
</el-upload>
<el-dialog :visible.sync="dialogVisible">
<img width="100%" :src="dialogImageUrl" alt="">
</el-dialog>
</div>
<input id="fileIdStr" type="text" name="fileIdStr" hidden>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">税率:</label>
<div class="col-sm-8">
<div class="input-group">
<input name="taxRate" id="taxRate" th:field="*{taxRate}" class="form-control" placeholder="13" />
<span class="input-group-addon">%</span>
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label" for="cgjlVerifyApproved"><span style="color: red; ">*</span>审批意见:</label>
<div class="col-sm-8">
<select name="p_B_cgjlVerifyApproved" id="cgjlVerifyApproved" class="form-control m-b" required>
<option value=""></option>
<option value="true">同意</option>
<option value="false">拒绝</option>
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">批注:</label>
<div class="col-sm-8">
<textarea name="comment" class="form-control"></textarea>
</div>
</div>
<input id="purchaseQuoteChildList_cgjl" type="hidden" name="purchaseQuoteChildLists" class="form-control m-b" />
</form>
<div class="container">
<div class="form-row">
<div class="btn-group-sm" id="toolbar" role="group">
<span>选择报价信息</span>
</div>
</div>
<div class="row">
<div class="col-sm-12 select-table table-striped">
<table id="bootstrap-sub-table-purchaseQuoteChild"></table>
</div>
</div>
</div>
</div>
<th:block th:include="include :: footer" />
<th:block th:include="include :: select2-js" />
<th:block th:include="include :: bootstrap-table-editable-js" />
<th:block th:include="include :: datetimepicker-js" />
<script th:src="@{/js/activiti.js}"></script>
<script th:src="@{/ajax/libs/vue/vue.js}"></script>
<script th:src="@{/ajax/libs/element-ui/element-ui.js}"></script>
<script th:inline="javascript">
var materialTypeDatas = [[${@category.getChildByCode('materialType')}]];
var auditStatusDatas = [[${@dict.getType('auditStatus')}]];
var sysUnitClassDatas = [[${@dict.getType('sys_unit_class')}]];
var processMethodDatas = [[${@dict.getType('processMethod')}]];
var loginName = [[${@permission.getPrincipalProperty('loginName')}]];
var prefix = ctx + "purchase/purchaseQuote";
var purchaseQuote = [[${formData}]];
new Vue({
el: '#app',
data: function() {
return {
fileList: [],
fileUploadUrl: ctx + "common/uploadSingleFile",
fileDeleteUrl: ctx + "common/deleteFile",
fileIdList:[],
dialogImageUrl: '',
dialogVisible: false
}
},
methods: {
handlePictureCardPreview(file) {
this.dialogImageUrl = file.url;
this.dialogVisible = true;
},
uploadSuccess(response, file, fileList) {
console.log(response);
if(response.code == web_status.SUCCESS){
var attachFileId = response.data.id;
file.attachFileId = attachFileId;
this.fileIdList.push(attachFileId);
$("#fileIdStr").val(this.fileIdList.join(";"));
$.modal.msgSuccess("上传成功");
}else{
$.modal.alertError(response.msg);
}
},
uploadRemove(file, fileList) {
console.log(file, fileList);
var attachFileId = file.attachFileId;
$.ajax({
type: "get",
url: this.fileDeleteUrl,
data: {id:attachFileId},
cache: false,
async: false, // 设置成同步
dataType: 'json',
success: function(result) {
if (result.code == web_status.SUCCESS) {
var index = this.fileIdList.indexOf(attachFileId);
if(index!=-1){
this.fileIdList.splice(index,1);
$("#fileIdStr").val(this.fileIdList.join(";"));
}
$.modal.msgSuccess("删除附件成功。");
} else {
$.modal.alertError(result.msg);
}
},
error: function(error) {
$.modal.alertError("删除附件失败。");
}
});
},
}
});
$("#form-purchaseQuote-cgjl-audit").validate({focusCleanup: true});
$(function() {
var options = {
id:'bootstrap-sub-table-purchaseQuoteChild',
url: ctx + "purchase/purchaseQuoteChild/list",
pagination: false,
queryParams: function(params) {
var temp = {
pageSize: params.limit,
pageNum: params.offset / params.limit + 1,
sortName: params.sort,
sortOrder: params.order,
purchaseQuoteCode: purchaseQuote.purchaseQuoteCode,
delFlag: 0
}
return temp;
},
sidePagination: "client",
model: "物料报价信息",
columns: [
{checkbox: true},
{title: '物料索引id',field: 'materialId',align: 'center',visible: false},
{title: '料号',field: 'materialCode',align: 'center'},
{title: '物料名称',field: 'materialName',align: 'center'},
{title: '图片',field: 'photoUrl',
formatter: function(value, row, index) {
return $.table.imageView(value);
}
},
{title: '物料类型',field: 'materialType',align: 'center',
formatter: function(value, row, index) {
return $.table.selectCategoryLabel(materialTypeDatas, value);
}
},
{ title: '描述',field: 'describe',align: 'center'},
{title: '品牌',field: 'brand',align: 'center'},
{ title: '单位',field: 'unit',align: 'center',
formatter: function(value, row, index) {
return $.table.selectDictLabel(sysUnitClassDatas, value);
}
},
{title: '半成品类型',field: 'processMethod',align: 'center',
formatter: function(value, row, index) {
return $.table.selectDictLabel(processMethodDatas, value);
}
},
{title:'最新报价',field: 'materialSole',align: 'center',},
{title: '物料的数量', field: 'materialNum',align: 'center',editable: true,visible: false},
{title: '物料的不含税单价(RMB)',field: 'materialNoRmb',align: 'center',},
{title: '物料的含税单价(RMB)',field: 'materialRmb',align: 'center',},
{title: '录入人',field: 'createBy',align: 'center',visible: false},
{title: '录入时间',field: 'createTime',align: 'center',visible: false },
{title: '更新人',field: 'updateBy',align: 'center',visible: false},
{title: '上次更新时间',field: 'updateTime',align: 'center',visible: false},
{title: '备注',field: 'remark',align: 'center'},
],
};
$.table.init(options);
});
function doSubmit(index, layero,uniqueId){
console.log(uniqueId);
var iframeWin = window[layero.find('iframe')[0]['name']];
var rowData = iframeWin.$('#bootstrap-select-table').bootstrapTable('getSelections')[0];
console.log("rowData: "+rowData);
$("#bootstrap-sub-table-purchaseQuoteChild").bootstrapTable('insertRow', {
index:1,
row: {
materialId:rowData.id,
materialCode: rowData.materialNo,
materialName: rowData.materialName,
materialType: rowData.materialType,
describe: rowData.describe,
brand: rowData.brand,
unit: rowData.unit,
processMethod: rowData.processMethod,
photoUrl: rowData.photoUrl,
materialSole: '',
materialNum: 1,
materialRmb: "",
materialNoRmb: "",
materialNoRmbSum: "",
materialRmbSum: "",
remark: ""
}
})
layer.close(index);
}
function insertRow() {
var url = ctx + "erp/material/select";
var options = {
title: '选择料号',
url: url,
callBack: doSubmit
};
$.modal.openOptions(options);
}
/* 删除指定表格行 */
function removeRow(materialCode){
$("#bootstrap-sub-table-purchaseQuoteChild").bootstrapTable('remove', {
field: 'materialCode',
values: materialCode
})
}
function submitHandler() {
var taskId = [[${taskId}]];
if ($.validate.form()) {
if ($('textarea[name="comment"]').val()) {
$('input[name="p_COM_comment"]').val($('textarea[name="comment"]').val());
}
var tableData = $("#bootstrap-sub-table-purchaseQuoteChild").bootstrapTable('getData');
$('input[name="purchaseQuoteChildLists"]').val(JSON.stringify(tableData));
var formData = $("#form-purchaseQuote-cgjl-audit").serialize();
$.operate.save(prefix + "/complete/" + taskId,formData);
}
}
$("input[name='pricingDate']").datetimepicker({
format: "yyyy-mm-dd",
minView: "month",
autoclose: true
});
</script>
</body>
</html>

335
ruoyi-admin/src/main/resources/templates/purchase/purchaseQuote/taskCgzgVerify.html

@ -0,0 +1,335 @@
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
<head>
<th:block th:include="include :: header('采购主管审核')" />
<th:block th:include="include :: select2-css" />
<th:block th:include="include :: datetimepicker-css" />
<th:block th:include="include :: bootstrap-editable-css" />
<link th:href="@{/ajax/libs/element-ui/element-ui.css}" rel="stylesheet"/>
</head>
<body class="white-bg">
<div id="app" class="wrapper wrapper-content animated fadeInRight ibox-content">
<form class="form-horizontal m" id="form-purchaseQuote-cgzg-audit" th:object="${formData}">
<input name="purchaseQuoteId" th:field="*{purchaseQuoteId}" type="hidden">
<input name="taskId" th:field="*{taskId}" type="hidden">
<input name="taskName" th:field="*{taskName}" type="hidden">
<input name="instanceId" th:field="*{instanceId}" type="hidden">
<input name="instanceType" th:field="*{instanceType}" type="hidden">
<input type="hidden" name="p_COM_comment" />
<div class="form-group">
<label class="col-sm-3 control-label">申请人:</label>
<div class="col-sm-8">
<input name="applyUser" th:field="*{applyUser}" class="form-control" type="text" readonly>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">申请时间:</label>
<div class="col-sm-8">
<div class="input-group date">
<input name="applyTime" th:value="${#dates.format(formData.applyTime, 'yyyy-MM-dd HH:mm')}" class="form-control" type="text" disabled>
<span class="input-group-addon"><i class="fa fa-calendar"></i></span>
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">标题:</label>
<div class="col-sm-8">
<input name="title" th:field="*{applyTitle}" class="form-control" type="text" disabled>
</div>
</div>
<div class="form-group" hidden="hidden">
<label class="col-sm-3 control-label" >采购报价单号:</label>
<div class="col-sm-8">
<input id="purchaseQuoteCode_edit" name="purchaseQuoteCode" th:field="*{purchaseQuoteCode}" class="form-control" type="text" readonly>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">供应商ID:</label>
<div class="col-sm-8">
<input name="supplierQuoteCode" th:field="*{supplierQuoteCode}" class="form-control" />
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">供应商名称:</label>
<div class="col-sm-8">
<input name="supplierName" th:field="*{supplierName}" class="form-control">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">定价日期:</label>
<div class="input-group date">
<input name="pricingDate" th:field="*{pricingDate}" class="form-control" type="text">
<span class="input-group-addon"><i class="fa fa-calendar"></i></span>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">备注说明:</label>
<div class="col-sm-8">
<textarea name="remark" class="form-control" th:field="*{remark}"></textarea>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">附件:</label>
<div class="col-sm-8">
<el-upload
:action="fileUploadUrl"
:on-success="uploadSuccess"
:on-preview="handlePictureCardPreview"
:on-remove="uploadRemove"
:file-list="fileList"
:limit="5"
list-type="picture"
accept=".jpg,.png"
multiple>
<el-button size="small" type="primary">点击上传</el-button>
<div slot="tip" class="el-upload__tip">只能上传jpg/png文件,第一张图片为主图</div>
</el-upload>
<el-dialog :visible.sync="dialogVisible">
<img width="100%" :src="dialogImageUrl" alt="">
</el-dialog>
</div>
<input id="fileIdStr" type="text" name="fileIdStr" hidden>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">税率:</label>
<div class="col-sm-8">
<div class="input-group">
<input name="taxRate" id="taxRate" th:field="*{taxRate}" class="form-control" placeholder="13" />
<span class="input-group-addon">%</span>
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label" for="cgzgVerifyApproved"><span style="color: red; ">*</span>审批意见:</label>
<div class="col-sm-8">
<select name="p_B_cgzgVerifyApproved" id="cgzgVerifyApproved" class="form-control m-b" required>
<option value=""></option>
<option value="true">同意</option>
<option value="false">拒绝</option>
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">批注:</label>
<div class="col-sm-8">
<textarea name="comment" class="form-control"></textarea>
</div>
</div>
<input id="purchaseQuoteChildList_cgzg" type="hidden" name="purchaseQuoteChildLists" class="form-control m-b" />
</form>
<div class="container">
<div class="form-row">
<div class="btn-group-sm" id="toolbar" role="group">
<span>选择报价信息</span>
</div>
</div>
<div class="row">
<div class="col-sm-12 select-table table-striped">
<table id="bootstrap-sub-table-purchaseQuoteChild"></table>
</div>
</div>
</div>
</div>
<th:block th:include="include :: footer" />
<th:block th:include="include :: select2-js" />
<th:block th:include="include :: bootstrap-table-editable-js" />
<th:block th:include="include :: datetimepicker-js" />
<script th:src="@{/js/activiti.js}"></script>
<script th:src="@{/ajax/libs/vue/vue.js}"></script>
<script th:src="@{/ajax/libs/element-ui/element-ui.js}"></script>
<script th:inline="javascript">
var materialTypeDatas = [[${@category.getChildByCode('materialType')}]];
var auditStatusDatas = [[${@dict.getType('auditStatus')}]];
var sysUnitClassDatas = [[${@dict.getType('sys_unit_class')}]];
var processMethodDatas = [[${@dict.getType('processMethod')}]];
var loginName = [[${@permission.getPrincipalProperty('loginName')}]];
var prefix = ctx + "purchase/purchaseQuote";
var purchaseQuote = [[${formData}]];
new Vue({
el: '#app',
data: function() {
return {
fileList: [],
fileUploadUrl: ctx + "common/uploadSingleFile",
fileDeleteUrl: ctx + "common/deleteFile",
fileIdList:[],
dialogImageUrl: '',
dialogVisible: false
}
},
methods: {
handlePictureCardPreview(file) {
this.dialogImageUrl = file.url;
this.dialogVisible = true;
},
uploadSuccess(response, file, fileList) {
console.log(response);
if(response.code == web_status.SUCCESS){
var attachFileId = response.data.id;
file.attachFileId = attachFileId;
this.fileIdList.push(attachFileId);
$("#fileIdStr").val(this.fileIdList.join(";"));
$.modal.msgSuccess("上传成功");
}else{
$.modal.alertError(response.msg);
}
},
uploadRemove(file, fileList) {
console.log(file, fileList);
var attachFileId = file.attachFileId;
$.ajax({
type: "get",
url: this.fileDeleteUrl,
data: {id:attachFileId},
cache: false,
async: false, // 设置成同步
dataType: 'json',
success: function(result) {
if (result.code == web_status.SUCCESS) {
var index = this.fileIdList.indexOf(attachFileId);
if(index!=-1){
this.fileIdList.splice(index,1);
$("#fileIdStr").val(this.fileIdList.join(";"));
}
$.modal.msgSuccess("删除附件成功。");
} else {
$.modal.alertError(result.msg);
}
},
error: function(error) {
$.modal.alertError("删除附件失败。");
}
});
},
}
});
$("#form-purchaseQuote-cgzg-audit").validate({focusCleanup: true});
$(function() {
var options = {
id:'bootstrap-sub-table-purchaseQuoteChild',
url: ctx + "purchase/purchaseQuoteChild/list",
pagination: false,
queryParams: function(params) {
var temp = {
pageSize: params.limit,
pageNum: params.offset / params.limit + 1,
sortName: params.sort,
sortOrder: params.order,
purchaseQuoteCode: purchaseQuote.purchaseQuoteCode,
delFlag: 0
}
return temp;
},
sidePagination: "client",
model: "物料报价信息",
columns: [
{checkbox: true},
{title: '物料索引id',field: 'materialId',align: 'center',visible: false},
{title: '料号',field: 'materialCode',align: 'center'},
{title: '物料名称',field: 'materialName',align: 'center'},
{title: '图片',field: 'photoUrl',
formatter: function(value, row, index) {
return $.table.imageView(value);
}
},
{title: '物料类型',field: 'materialType',align: 'center',
formatter: function(value, row, index) {
return $.table.selectCategoryLabel(materialTypeDatas, value);
}
},
{ title: '描述',field: 'describe',align: 'center'},
{title: '品牌',field: 'brand',align: 'center'},
{ title: '单位',field: 'unit',align: 'center',
formatter: function(value, row, index) {
return $.table.selectDictLabel(sysUnitClassDatas, value);
}
},
{title: '半成品类型',field: 'processMethod',align: 'center',
formatter: function(value, row, index) {
return $.table.selectDictLabel(processMethodDatas, value);
}
},
{title:'最新报价',field: 'materialSole',align: 'center',},
{title: '物料的数量', field: 'materialNum',align: 'center',editable: true,visible: false},
{title: '物料的不含税单价(RMB)',field: 'materialNoRmb',align: 'center'},
{title: '物料的含税单价(RMB)',field: 'materialRmb',align: 'center'},
{title: '录入人',field: 'createBy',align: 'center',visible: false},
{title: '录入时间',field: 'createTime',align: 'center',visible: false },
{title: '更新人',field: 'updateBy',align: 'center',visible: false},
{title: '上次更新时间',field: 'updateTime',align: 'center',visible: false},
{title: '备注',field: 'remark',align: 'center'},
],
};
$.table.init(options);
});
function doSubmit(index, layero,uniqueId){
console.log(uniqueId);
var iframeWin = window[layero.find('iframe')[0]['name']];
var rowData = iframeWin.$('#bootstrap-select-table').bootstrapTable('getSelections')[0];
console.log("rowData: "+rowData);
$("#bootstrap-sub-table-purchaseQuoteChild").bootstrapTable('insertRow', {
index:1,
row: {
materialId:rowData.id,
materialCode: rowData.materialNo,
materialName: rowData.materialName,
materialType: rowData.materialType,
describe: rowData.describe,
brand: rowData.brand,
unit: rowData.unit,
processMethod: rowData.processMethod,
photoUrl: rowData.photoUrl,
materialSole: '',
materialNum: 1,
materialRmb: "",
materialNoRmb: "",
materialNoRmbSum: "",
materialRmbSum: "",
remark: ""
}
})
layer.close(index);
}
function insertRow() {
var url = ctx + "erp/material/select";
var options = {
title: '选择料号',
url: url,
callBack: doSubmit
};
$.modal.openOptions(options);
}
/* 删除指定表格行 */
function removeRow(materialCode){
$("#bootstrap-sub-table-purchaseQuoteChild").bootstrapTable('remove', {
field: 'materialCode',
values: materialCode
})
}
function submitHandler() {
var taskId = [[${taskId}]];
if ($.validate.form()) {
if ($('textarea[name="comment"]').val()) {
$('input[name="p_COM_comment"]').val($('textarea[name="comment"]').val());
}
var tableData = $("#bootstrap-sub-table-purchaseQuoteChild").bootstrapTable('getData');
if (tableData.length === 0) {
$.modal.alertWarning("子表数据不能为空!");
} else {
// 将子表数据添加到FormData中
$('input[name="purchaseQuoteChildLists"]').val(JSON.stringify(tableData));
var formData = $("#form-purchaseQuote-cgzg-audit").serialize();
// 发送请求
$.operate.save(prefix + "/complete/" + taskId, formData)
}
}
}
$("input[name='pricingDate']").datetimepicker({
format: "yyyy-mm-dd",
minView: "month",
autoclose: true
});
</script>
</body>
</html>

318
ruoyi-admin/src/main/resources/templates/purchase/purchaseQuote/taskModifyApply.html

@ -0,0 +1,318 @@
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
<head>
<th:block th:include="include :: header('驳回申请')" />
<th:block th:include="include :: select2-css" />
<th:block th:include="include :: datetimepicker-css" />
<th:block th:include="include :: bootstrap-editable-css" />
<link th:href="@{/ajax/libs/element-ui/element-ui.css}" rel="stylesheet"/>
</head>
<body class="white-bg">
<div id="app" class="wrapper wrapper-content animated fadeInRight ibox-content">
<form class="form-horizontal m" id="form-purchaseQuote-modify" th:object="${formData}">
<input name="purchaseQuoteId" th:field="*{purchaseQuoteId}" type="hidden">
<input name="taskId" th:field="*{taskId}" type="hidden">
<input name="taskName" th:field="*{taskName}" type="hidden">
<input name="instanceId" th:field="*{instanceId}" type="hidden">
<input name="instanceType" th:field="*{instanceType}" type="hidden">
<!--驳回调整允许更新内容-->
<input type="hidden" name="saveEntity" value="true" />
<input type="hidden" name="p_B_reApply" class="form-control m-b" />
<div class="form-group" hidden="hidden">
<label class="col-sm-3 control-label" >采购报价单号:</label>
<div class="col-sm-8">
<input id="purchaseQuoteCode_edit" name="purchaseQuoteCode" th:field="*{purchaseQuoteCode}" class="form-control" type="text" readonly>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">供应商ID:</label>
<div class="col-sm-8">
<input name="supplierQuoteCode" th:field="*{supplierQuoteCode}" class="form-control" />
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">供应商名称:</label>
<div class="col-sm-8">
<input name="supplierName" th:field="*{supplierName}" class="form-control">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">定价日期:</label>
<div class="input-group date">
<input name="pricingDate" th:field="*{pricingDate}" class="form-control" type="text">
<span class="input-group-addon"><i class="fa fa-calendar"></i></span>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">备注说明:</label>
<div class="col-sm-8">
<textarea name="remark" class="form-control" th:field="*{remark}"></textarea>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">附件:</label>
<div class="col-sm-8">
<el-upload
:action="fileUploadUrl"
:on-success="uploadSuccess"
:on-preview="handlePictureCardPreview"
:on-remove="uploadRemove"
:file-list="fileList"
:limit="5"
list-type="picture"
accept=".jpg,.png"
multiple>
<el-button size="small" type="primary">点击上传</el-button>
<div slot="tip" class="el-upload__tip">只能上传jpg/png文件,第一张图片为主图</div>
</el-upload>
<el-dialog :visible.sync="dialogVisible">
<img width="100%" :src="dialogImageUrl" alt="">
</el-dialog>
</div>
<input id="fileIdStr" type="text" name="fileIdStr" hidden>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">税率:</label>
<div class="col-sm-8">
<div class="input-group">
<input name="taxRate" id="taxRate" th:field="*{taxRate}" class="form-control" placeholder="13" />
<span class="input-group-addon">%</span>
</div>
</div>
</div>
<div class="container">
<div class="form-group">
<label class="col-sm-3 control-label" for="reApply">是否继续申请:</label>
<div class="col-sm-8">
<select id="reApply" name="reApply" class="form-control m-b">
<option value="true">重新申请</option>
<option value="false">结束流程</option>
</select>
</div>
</div>
</div>
<input id="purchaseQuoteChildList_modify" type="hidden" name="purchaseQuoteChildLists" class="form-control m-b" />
</form>
<div class="container">
<div class="form-row">
<div class="btn-group-sm" id="toolbar" role="group">
<span>选择报价信息</span>
<a class="btn btn-success" onclick="insertRow()">
<i class="fa fa-plus"></i> 添加物料
</a>
</div>
</div>
<div class="row">
<div class="col-sm-12 select-table table-striped">
<table id="bootstrap-sub-table-purchaseQuoteChild"></table>
</div>
</div>
</div>
</div>
<th:block th:include="include :: footer" />
<th:block th:include="include :: select2-js"/>
<th:block th:include="include :: datetimepicker-js"/>
<script th:src="@{/js/activiti.js}"></script>
<script th:src="@{/ajax/libs/vue/vue.js}"></script>
<script th:src="@{/ajax/libs/element-ui/element-ui.js}"></script>
<script th:inline="javascript">
var materialTypeDatas = [[${@category.getChildByCode('materialType')}]];
var auditStatusDatas = [[${@dict.getType('auditStatus')}]];
var sysUnitClassDatas = [[${@dict.getType('sys_unit_class')}]];
var processMethodDatas = [[${@dict.getType('processMethod')}]];
var loginName = [[${@permission.getPrincipalProperty('loginName')}]];
var prefix = ctx + "purchase/purchaseQuote";
var purchaseQuote = [[${formData}]];
new Vue({
el: '#app',
data: function() {
return {
fileList: [],
fileUploadUrl: ctx + "common/uploadSingleFile",
fileDeleteUrl: ctx + "common/deleteFile",
fileIdList:[],
dialogImageUrl: '',
dialogVisible: false
}
},
methods: {
handlePictureCardPreview(file) {
this.dialogImageUrl = file.url;
this.dialogVisible = true;
},
uploadSuccess(response, file, fileList) {
console.log(response);
if(response.code == web_status.SUCCESS){
var attachFileId = response.data.id;
file.attachFileId = attachFileId;
this.fileIdList.push(attachFileId);
$("#fileIdStr").val(this.fileIdList.join(";"));
$.modal.msgSuccess("上传成功");
}else{
$.modal.alertError(response.msg);
}
},
uploadRemove(file, fileList) {
console.log(file, fileList);
var attachFileId = file.attachFileId;
$.ajax({
type: "get",
url: this.fileDeleteUrl,
data: {id:attachFileId},
cache: false,
async: false, // 设置成同步
dataType: 'json',
success: function(result) {
if (result.code == web_status.SUCCESS) {
var index = this.fileIdList.indexOf(attachFileId);
if(index!=-1){
this.fileIdList.splice(index,1);
$("#fileIdStr").val(this.fileIdList.join(";"));
}
$.modal.msgSuccess("删除附件成功。");
} else {
$.modal.alertError(result.msg);
}
},
error: function(error) {
$.modal.alertError("删除附件失败。");
}
});
},
}
});
$("#form-purchaseQuote-modify").validate({focusCleanup: true});
$(function() {
var options = {
id:'bootstrap-sub-table-purchaseQuoteChild',
url: ctx + "purchase/purchaseQuoteChild/list",
pagination: false,
queryParams: function(params) {
var temp = {
pageSize: params.limit,
pageNum: params.offset / params.limit + 1,
sortName: params.sort,
sortOrder: params.order,
purchaseQuoteCode: purchaseQuote.purchaseQuoteCode,
delFlag: 0
}
return temp;
},
sidePagination: "client",
model: "物料报价信息",
columns: [
{checkbox: true},
{title: '物料索引id',field: 'materialId',align: 'center',visible: false},
{title: '料号',field: 'materialCode',align: 'center'},
{title: '物料名称',field: 'materialName',align: 'center'},
{title: '图片',field: 'photoUrl',
formatter: function(value, row, index) {
return $.table.imageView(value);
}
},
{title: '物料类型',field: 'materialType',align: 'center',
formatter: function(value, row, index) {
return $.table.selectCategoryLabel(materialTypeDatas, value);
}
},
{ title: '描述',field: 'describe',align: 'center'},
{title: '品牌',field: 'brand',align: 'center'},
{ title: '单位',field: 'unit',align: 'center',
formatter: function(value, row, index) {
return $.table.selectDictLabel(sysUnitClassDatas, value);
}
},
{title: '半成品类型',field: 'processMethod',align: 'center',
formatter: function(value, row, index) {
return $.table.selectDictLabel(processMethodDatas, value);
}
},
{title:'最新报价',field: 'materialSole',align: 'center',},
{title: '物料的数量', field: 'materialNum',align: 'center',editable: true,visible: false},
{title: '物料的不含税单价(RMB)',field: 'materialNoRmb',align: 'center',editable: true,},
{title: '物料的含税单价(RMB)',field: 'materialRmb',align: 'center',editable: true,},
{title: '录入人',field: 'createBy',align: 'center',visible: false},
{title: '录入时间',field: 'createTime',align: 'center',visible: false },
{title: '更新人',field: 'updateBy',align: 'center',visible: false},
{title: '上次更新时间',field: 'updateTime',align: 'center',visible: false},
{title: '备注',field: 'remark',align: 'center'},
{title: '操作', align: 'center',
formatter: function (value, row, index) {
var actions = [];
actions.push('<a class="btn btn-danger btn-xs" href="javascript:void(0)" onclick="removeRow(\'' + row.materialCode + '\')"><i class="fa fa-remove"></i>删除</a> ');
return actions.join('');
}
}
],
};
$.table.init(options);
});
function doSubmit(index, layero,uniqueId){
console.log(uniqueId);
var iframeWin = window[layero.find('iframe')[0]['name']];
var rowData = iframeWin.$('#bootstrap-select-table').bootstrapTable('getSelections')[0];
console.log("rowData: "+rowData);
$("#bootstrap-sub-table-purchaseQuoteChild").bootstrapTable('insertRow', {
index:1,
row: {
materialId:rowData.id,
materialCode: rowData.materialNo,
materialName: rowData.materialName,
materialType: rowData.materialType,
describe: rowData.describe,
brand: rowData.brand,
unit: rowData.unit,
processMethod: rowData.processMethod,
photoUrl: rowData.photoUrl,
materialSole: '',
materialNum: 1,
materialRmb: "",
materialNoRmb: "",
materialNoRmbSum: "",
materialRmbSum: "",
remark: ""
}
})
layer.close(index);
}
function insertRow() {
var url = ctx + "erp/material/select";
var options = {
title: '选择料号',
url: url,
callBack: doSubmit
};
$.modal.openOptions(options);
}
/* 删除指定表格行 */
function removeRow(materialCode){
$("#bootstrap-sub-table-purchaseQuoteChild").bootstrapTable('remove', {
field: 'materialCode',
values: materialCode
})
}
$("input[name='pricingDate']").datetimepicker({
format: "yyyy-mm-dd",
minView: "month",
autoclose: true
});
function submitHandler() {
if ($.validate.form()) {
$("#p_B_reApply").val($("#reApply").val());
var taskId = [[${taskId}]];
var tableData = $("#bootstrap-sub-table-purchaseQuoteChild").bootstrapTable('getData');
if (tableData.length === 0) {
$.modal.alertWarning("子表数据不能为空!");
} else {
// 将子表数据添加到FormData中
$("#purchaseQuoteChildList_modify").val(JSON.stringify(tableData));
var formData = $("#form-purchaseQuote-modify").serialize();
// 发送请求
$.operate.save(prefix + "/complete/" + taskId, formData)
}
}
}
</script>
</body>
</html>
Loading…
Cancel
Save