Browse Source

[feat]销售管理:修改销售估价添加、编辑页面,新增销售估计物料详情表添加功能,新增销售估价物料表功能,计算销售估价的物料的金额。

dev
zhangsiqi 9 months ago
parent
commit
dbc3c8b629
  1. 7
      ruoyi-admin/src/main/java/com/ruoyi/sales/controller/SalesEstimateController.java
  2. 151
      ruoyi-admin/src/main/java/com/ruoyi/sales/controller/SysSalesEstimateChildController.java
  3. 14
      ruoyi-admin/src/main/java/com/ruoyi/sales/domain/SalesEstimate.java
  4. 450
      ruoyi-admin/src/main/java/com/ruoyi/sales/domain/SysSalesEstimateChild.java
  5. 77
      ruoyi-admin/src/main/java/com/ruoyi/sales/mapper/SysSalesEstimateChildMapper.java
  6. 2
      ruoyi-admin/src/main/java/com/ruoyi/sales/service/ISalesEstimateService.java
  7. 75
      ruoyi-admin/src/main/java/com/ruoyi/sales/service/ISysSalesEstimateChildService.java
  8. 10
      ruoyi-admin/src/main/java/com/ruoyi/sales/service/impl/SalesEstimateServiceImpl.java
  9. 126
      ruoyi-admin/src/main/java/com/ruoyi/sales/service/impl/SysSalesEstimateChildServiceImpl.java
  10. 213
      ruoyi-admin/src/main/resources/mapper/sales/SysSalesEstimateChildMapper.xml
  11. 314
      ruoyi-admin/src/main/resources/templates/sales/EstimateChild/EstimateChild.html
  12. 211
      ruoyi-admin/src/main/resources/templates/sales/EstimateChild/add.html
  13. 655
      ruoyi-admin/src/main/resources/templates/sales/salesEstimate/add.html
  14. 572
      ruoyi-admin/src/main/resources/templates/sales/salesEstimate/edit.html
  15. 113
      ruoyi-admin/src/main/resources/templates/sales/salesEstimate/salesEstimate.html

7
ruoyi-admin/src/main/java/com/ruoyi/sales/controller/SalesEstimateController.java

@ -147,5 +147,10 @@ public class SalesEstimateController extends BaseController
return toAjax(salesEstimateService.restoreSalesEstimateById(id));
}
@RequestMapping("/getId")
@ResponseBody
public AjaxResult getId()
{
return AjaxResult.success(salesEstimateService.getId());
}
}

151
ruoyi-admin/src/main/java/com/ruoyi/sales/controller/SysSalesEstimateChildController.java

@ -0,0 +1,151 @@
package com.ruoyi.sales.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.sales.domain.SysSalesEstimateChild;
import com.ruoyi.sales.service.ISysSalesEstimateChildService;
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 zhang
* @date 2024-05-27
*/
@Controller
@RequestMapping("/sales/EstimateChild")
public class SysSalesEstimateChildController extends BaseController
{
private String prefix = "sales/EstimateChild";
@Autowired
private ISysSalesEstimateChildService sysSalesEstimateChildService;
@RequiresPermissions("sales:EstimateChild:view")
@GetMapping()
public String EstimateChild()
{
return prefix + "/EstimateChild";
}
/**
* 查询销售物料估价列表
*/
@RequiresPermissions("sales:EstimateChild:list")
@PostMapping("/list")
@ResponseBody
public TableDataInfo list(SysSalesEstimateChild sysSalesEstimateChild)
{
startPage();
List<SysSalesEstimateChild> list = sysSalesEstimateChildService.selectSysSalesEstimateChildList(sysSalesEstimateChild);
return getDataTable(list);
}
/**
* 导出销售物料估价列表
*/
@RequiresPermissions("sales:EstimateChild:export")
@Log(title = "销售物料估价", businessType = BusinessType.EXPORT)
@PostMapping("/export")
@ResponseBody
public AjaxResult export(SysSalesEstimateChild sysSalesEstimateChild)
{
List<SysSalesEstimateChild> list = sysSalesEstimateChildService.selectSysSalesEstimateChildList(sysSalesEstimateChild);
ExcelUtil<SysSalesEstimateChild> util = new ExcelUtil<SysSalesEstimateChild>(SysSalesEstimateChild.class);
return util.exportExcel(list, "销售物料估价数据");
}
/**
* 新增销售物料估价
*/
@GetMapping("/add")
public String add()
{
return prefix + "/add";
}
/**
* 新增保存销售物料估价
*/
@RequiresPermissions("sales:EstimateChild:add")
@Log(title = "销售物料估价", businessType = BusinessType.INSERT)
@PostMapping("/add")
@ResponseBody
public AjaxResult addSave(SysSalesEstimateChild sysSalesEstimateChild)
{
return toAjax(sysSalesEstimateChildService.insertSysSalesEstimateChild(sysSalesEstimateChild));
}
/**
* 修改销售物料估价
*/
@GetMapping("/edit/{id}")
public String edit(@PathVariable("id") Long id, ModelMap mmap)
{
SysSalesEstimateChild sysSalesEstimateChild = sysSalesEstimateChildService.selectSysSalesEstimateChildById(id);
mmap.put("sysSalesEstimateChild", sysSalesEstimateChild);
return prefix + "/edit";
}
/**
* 修改保存销售物料估价
*/
@RequiresPermissions("sales:EstimateChild:edit")
@Log(title = "销售物料估价", businessType = BusinessType.UPDATE)
@PostMapping("/edit")
@ResponseBody
public AjaxResult editSave(SysSalesEstimateChild sysSalesEstimateChild)
{
return toAjax(sysSalesEstimateChildService.updateSysSalesEstimateChild(sysSalesEstimateChild));
}
/**
* 删除销售物料估价
*/
@RequiresPermissions("sales:EstimateChild:remove")
@Log(title = "销售物料估价", businessType = BusinessType.DELETE)
@PostMapping( "/remove")
@ResponseBody
public AjaxResult remove(String ids)
{
return toAjax(sysSalesEstimateChildService.deleteSysSalesEstimateChildByIds(ids));
}
/**
* 作废销售物料估价
*/
@RequiresPermissions("sales:EstimateChild:cancel")
@Log(title = "销售物料估价", businessType = BusinessType.CANCEL)
@GetMapping( "/cancel/{id}")
@ResponseBody
public AjaxResult cancel(@PathVariable("id") Long id){
return toAjax(sysSalesEstimateChildService.cancelSysSalesEstimateChildById(id));
}
/**
* 恢复销售物料估价
*/
@RequiresPermissions("sales:EstimateChild:restore")
@Log(title = "销售物料估价", businessType = BusinessType.RESTORE)
@GetMapping( "/restore/{id}")
@ResponseBody
public AjaxResult restore(@PathVariable("id")Long id)
{
return toAjax(sysSalesEstimateChildService.restoreSysSalesEstimateChildById(id));
}
}

14
ruoyi-admin/src/main/java/com/ruoyi/sales/domain/SalesEstimate.java

@ -2,7 +2,8 @@ package com.ruoyi.sales.domain;
import java.math.BigDecimal;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.List;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
@ -71,6 +72,8 @@ public class SalesEstimate extends BaseEntity
/** 不含税总价(美元) */
@Excel(name = "不含税总价", readConverterExp = "美=元")
private BigDecimal allPriceExcludingTaxDollar;
//估价日期
private String pricingDate;
/** 流程实例ID */
private String instanceId;
@ -96,6 +99,15 @@ public class SalesEstimate extends BaseEntity
/** 流程恢复实例ID */
private String restoreInstanceId;
private List<SysSalesEstimateChild> sysSalesEstimateChildList;
public void setPricingDate(String pricingDate) {
this.pricingDate = pricingDate;
}
public String getPricingDate() {
return pricingDate ;
}
public void setAftersalesEstimateId(Long aftersalesEstimateId)
{
this.aftersalesEstimateId = aftersalesEstimateId;

450
ruoyi-admin/src/main/java/com/ruoyi/sales/domain/SysSalesEstimateChild.java

@ -0,0 +1,450 @@
package com.ruoyi.sales.domain;
import java.math.BigDecimal;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
/**
* 销售物料估价对象 sys_sales_estimate_child
*
* @author zhang
* @date 2024-05-27
*/
public class SysSalesEstimateChild extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 销售估价子表id */
private Long id;
/** 关联销售估价编号 */
@Excel(name = "关联销售估价编号")
private String quoteId;
/** 物料表中的id */
@Excel(name = "物料表中的id")
private Long materialId;
/** 物料表中的编号 */
@Excel(name = "物料表中的编号")
private String materialCode;
/** 物料的名称 */
@Excel(name = "物料的名称")
private String materialName;
/** 物料相关的BOM编号 */
@Excel(name = "物料相关的BOM编号")
private String materialBom;
/** 物料的类型 */
@Excel(name = "物料的类型")
private String materialType;
/** 物料的加工方式 */
@Excel(name = "物料的加工方式")
private String processMethod;
/** 物料的品牌 */
@Excel(name = "物料的品牌")
private String brand;
/** 物料的图片 */
@Excel(name = "物料的图片")
private String photoUrl;
/** 单位 */
@Excel(name = "单位")
private String unit;
/** 物料的描述 */
@Excel(name = "物料的描述")
private String describe;
/** 国内税率 */
@Excel(name = "国内税率")
private BigDecimal countTax;
/** 美元汇率 */
@Excel(name = "美元汇率")
private BigDecimal usdTax;
/** 物料的数量 */
@Excel(name = "物料的数量")
private Long materialNum;
/** 物料的对外报价 */
@Excel(name = "物料的对外报价")
private BigDecimal materialSole;
/** 物料的不含税单价(RMB) */
@Excel(name = "物料的不含税单价(RMB)")
private BigDecimal materialRmb;
/** 物料的含税单价(RMB) */
@Excel(name = "物料的含税单价(RMB)")
private BigDecimal materialNoRmb;
/** 物料的不含税总价(RMB) */
@Excel(name = "物料的不含税总价(RMB)")
private Long materialRmbSum;
/** 物料的含税总价(RMB) */
@Excel(name = "物料的含税总价(RMB)")
private BigDecimal materialNoRmbSum;
/** 物料的不含税单价(美元) */
@Excel(name = "物料的不含税单价(美元)")
private BigDecimal materialNoUsd;
/** 物料的含税单价(美元) */
@Excel(name = "物料的含税单价(美元)")
private BigDecimal materialUsd;
/** 物料的不含税总价(美元) */
@Excel(name = "物料的不含税总价(美元)")
private BigDecimal materialNoUsdSum;
/** 物料的含税总价(美元) */
@Excel(name = "物料的含税总价(美元)")
private BigDecimal materialUsdSum;
/** 计划交付时间 */
@JsonFormat(pattern = "yyyy-MM-dd")
@Excel(name = "计划交付时间", width = 30, dateFormat = "yyyy-MM-dd")
private Date deliveryTime;
/** 质保天数 */
@Excel(name = "质保天数")
private String expiryDay;
/** 删除状态 */
@Excel(name = "删除状态")
private String useStatus;
/** 审核状态 */
@Excel(name = "审核状态")
private String auditStatus;
/** 已出库数量 */
private String outBoundQuantity;
/** 未出库数量 */
private String unBoundQuantity;
public void setId(Long id)
{
this.id = id;
}
public Long getId()
{
return id;
}
public void setQuoteId(String quoteId)
{
this.quoteId = quoteId;
}
public String getQuoteId()
{
return quoteId;
}
public void setMaterialId(Long materialId)
{
this.materialId = materialId;
}
public Long getMaterialId()
{
return materialId;
}
public void setMaterialCode(String materialCode)
{
this.materialCode = materialCode;
}
public String getMaterialCode()
{
return materialCode;
}
public void setMaterialName(String materialName)
{
this.materialName = materialName;
}
public String getMaterialName()
{
return materialName;
}
public void setMaterialBom(String materialBom)
{
this.materialBom = materialBom;
}
public String getMaterialBom()
{
return materialBom;
}
public void setMaterialType(String materialType)
{
this.materialType = materialType;
}
public String getMaterialType()
{
return materialType;
}
public void setProcessMethod(String processMethod)
{
this.processMethod = processMethod;
}
public String getProcessMethod()
{
return processMethod;
}
public void setBrand(String brand)
{
this.brand = brand;
}
public String getBrand()
{
return brand;
}
public void setPhotoUrl(String photoUrl)
{
this.photoUrl = photoUrl;
}
public String getPhotoUrl()
{
return photoUrl;
}
public void setUnit(String unit)
{
this.unit = unit;
}
public String getUnit()
{
return unit;
}
public void setDescribe(String describe)
{
this.describe = describe;
}
public String getDescribe()
{
return describe;
}
public void setCountTax(BigDecimal countTax)
{
this.countTax = countTax;
}
public BigDecimal getCountTax()
{
return countTax;
}
public void setUsdTax(BigDecimal usdTax)
{
this.usdTax = usdTax;
}
public BigDecimal getUsdTax()
{
return usdTax;
}
public void setMaterialNum(Long materialNum)
{
this.materialNum = materialNum;
}
public Long getMaterialNum()
{
return materialNum;
}
public void setMaterialSole(BigDecimal materialSole)
{
this.materialSole = materialSole;
}
public BigDecimal getMaterialSole()
{
return materialSole;
}
public void setMaterialRmb(BigDecimal materialRmb)
{
this.materialRmb = materialRmb;
}
public BigDecimal getMaterialRmb()
{
return materialRmb;
}
public void setMaterialNoRmb(BigDecimal materialNoRmb)
{
this.materialNoRmb = materialNoRmb;
}
public BigDecimal getMaterialNoRmb()
{
return materialNoRmb;
}
public void setMaterialRmbSum(Long materialRmbSum)
{
this.materialRmbSum = materialRmbSum;
}
public Long getMaterialRmbSum()
{
return materialRmbSum;
}
public void setMaterialNoRmbSum(BigDecimal materialNoRmbSum)
{
this.materialNoRmbSum = materialNoRmbSum;
}
public BigDecimal getMaterialNoRmbSum()
{
return materialNoRmbSum;
}
public void setMaterialNoUsd(BigDecimal materialNoUsd)
{
this.materialNoUsd = materialNoUsd;
}
public BigDecimal getMaterialNoUsd()
{
return materialNoUsd;
}
public void setMaterialUsd(BigDecimal materialUsd)
{
this.materialUsd = materialUsd;
}
public BigDecimal getMaterialUsd()
{
return materialUsd;
}
public void setMaterialNoUsdSum(BigDecimal materialNoUsdSum)
{
this.materialNoUsdSum = materialNoUsdSum;
}
public BigDecimal getMaterialNoUsdSum()
{
return materialNoUsdSum;
}
public void setMaterialUsdSum(BigDecimal materialUsdSum)
{
this.materialUsdSum = materialUsdSum;
}
public BigDecimal getMaterialUsdSum()
{
return materialUsdSum;
}
public void setDeliveryTime(Date deliveryTime)
{
this.deliveryTime = deliveryTime;
}
public Date getDeliveryTime()
{
return deliveryTime;
}
public void setExpiryDay(String expiryDay)
{
this.expiryDay = expiryDay;
}
public String getExpiryDay()
{
return expiryDay;
}
public void setUseStatus(String useStatus)
{
this.useStatus = useStatus;
}
public String getUseStatus()
{
return useStatus;
}
public void setAuditStatus(String auditStatus)
{
this.auditStatus = auditStatus;
}
public String getAuditStatus()
{
return auditStatus;
}
public void setOutBoundQuantity(String outBoundQuantity)
{
this.outBoundQuantity = outBoundQuantity;
}
public String getOutBoundQuantity()
{
return outBoundQuantity;
}
public void setUnBoundQuantity(String unBoundQuantity)
{
this.unBoundQuantity = unBoundQuantity;
}
public String getUnBoundQuantity()
{
return unBoundQuantity;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("quoteId", getQuoteId())
.append("materialId", getMaterialId())
.append("materialCode", getMaterialCode())
.append("materialName", getMaterialName())
.append("materialBom", getMaterialBom())
.append("materialType", getMaterialType())
.append("processMethod", getProcessMethod())
.append("brand", getBrand())
.append("photoUrl", getPhotoUrl())
.append("unit", getUnit())
.append("describe", getDescribe())
.append("countTax", getCountTax())
.append("usdTax", getUsdTax())
.append("materialNum", getMaterialNum())
.append("materialSole", getMaterialSole())
.append("materialRmb", getMaterialRmb())
.append("materialNoRmb", getMaterialNoRmb())
.append("materialRmbSum", getMaterialRmbSum())
.append("materialNoRmbSum", getMaterialNoRmbSum())
.append("materialNoUsd", getMaterialNoUsd())
.append("materialUsd", getMaterialUsd())
.append("materialNoUsdSum", getMaterialNoUsdSum())
.append("materialUsdSum", getMaterialUsdSum())
.append("deliveryTime", getDeliveryTime())
.append("expiryDay", getExpiryDay())
.append("createBy", getCreateBy())
.append("createTime", getCreateTime())
.append("updateBy", getUpdateBy())
.append("updateTime", getUpdateTime())
.append("remark", getRemark())
.append("useStatus", getUseStatus())
.append("auditStatus", getAuditStatus())
.append("outBoundQuantity", getOutBoundQuantity())
.append("unBoundQuantity", getUnBoundQuantity())
.toString();
}
}

77
ruoyi-admin/src/main/java/com/ruoyi/sales/mapper/SysSalesEstimateChildMapper.java

@ -0,0 +1,77 @@
package com.ruoyi.sales.mapper;
import java.util.List;
import com.ruoyi.sales.domain.SysSalesEstimateChild;
/**
* 销售物料估价Mapper接口
*
* @author zhang
* @date 2024-05-27
*/
public interface SysSalesEstimateChildMapper
{
/**
* 查询销售物料估价
*
* @param id 销售物料估价ID
* @return 销售物料估价
*/
public SysSalesEstimateChild selectSysSalesEstimateChildById(Long id);
/**
* 查询销售物料估价列表
*
* @param sysSalesEstimateChild 销售物料估价
* @return 销售物料估价集合
*/
public List<SysSalesEstimateChild> selectSysSalesEstimateChildList(SysSalesEstimateChild sysSalesEstimateChild);
/**
* 新增销售物料估价
*
* @param sysSalesEstimateChild 销售物料估价
* @return 结果
*/
public int insertSysSalesEstimateChild(SysSalesEstimateChild sysSalesEstimateChild);
/**
* 修改销售物料估价
*
* @param sysSalesEstimateChild 销售物料估价
* @return 结果
*/
public int updateSysSalesEstimateChild(SysSalesEstimateChild sysSalesEstimateChild);
/**
* 删除销售物料估价
*
* @param id 销售物料估价ID
* @return 结果
*/
public int deleteSysSalesEstimateChildById(Long id);
/**
* 批量删除销售物料估价
*
* @param ids 需要删除的数据ID
* @return 结果
*/
public int deleteSysSalesEstimateChildByIds(String[] ids);
/**
* 作废销售物料估价
*
* @param id 销售物料估价ID
* @return 结果
*/
public int cancelSysSalesEstimateChildById(Long id);
/**
* 恢复销售物料估价
*
* @param id 销售物料估价ID
* @return 结果
*/
public int restoreSysSalesEstimateChildById(Long id);
}

2
ruoyi-admin/src/main/java/com/ruoyi/sales/service/ISalesEstimateService.java

@ -72,4 +72,6 @@ public interface ISalesEstimateService
* @return
*/
int restoreSalesEstimateById(Long aftersalesEstimateId);
Object getId();
}

75
ruoyi-admin/src/main/java/com/ruoyi/sales/service/ISysSalesEstimateChildService.java

@ -0,0 +1,75 @@
package com.ruoyi.sales.service;
import java.util.List;
import com.ruoyi.sales.domain.SysSalesEstimateChild;
/**
* 销售物料估价Service接口
*
* @author zhang
* @date 2024-05-27
*/
public interface ISysSalesEstimateChildService
{
/**
* 查询销售物料估价
*
* @param id 销售物料估价ID
* @return 销售物料估价
*/
public SysSalesEstimateChild selectSysSalesEstimateChildById(Long id);
/**
* 查询销售物料估价列表
*
* @param sysSalesEstimateChild 销售物料估价
* @return 销售物料估价集合
*/
public List<SysSalesEstimateChild> selectSysSalesEstimateChildList(SysSalesEstimateChild sysSalesEstimateChild);
/**
* 新增销售物料估价
*
* @param sysSalesEstimateChild 销售物料估价
* @return 结果
*/
public int insertSysSalesEstimateChild(SysSalesEstimateChild sysSalesEstimateChild);
/**
* 修改销售物料估价
*
* @param sysSalesEstimateChild 销售物料估价
* @return 结果
*/
public int updateSysSalesEstimateChild(SysSalesEstimateChild sysSalesEstimateChild);
/**
* 批量删除销售物料估价
*
* @param ids 需要删除的数据ID
* @return 结果
*/
public int deleteSysSalesEstimateChildByIds(String ids);
/**
* 删除销售物料估价信息
*
* @param id 销售物料估价ID
* @return 结果
*/
public int deleteSysSalesEstimateChildById(Long id);
/**
* 作废销售物料估价
* @param id 销售物料估价ID
* @return
*/
int cancelSysSalesEstimateChildById(Long id);
/**
* 恢复销售物料估价
* @param id 销售物料估价ID
* @return
*/
int restoreSysSalesEstimateChildById(Long id);
}

10
ruoyi-admin/src/main/java/com/ruoyi/sales/service/impl/SalesEstimateServiceImpl.java

@ -1,6 +1,8 @@
package com.ruoyi.sales.service.impl;
import java.util.List;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.ShiroUtils;
import org.springframework.beans.factory.annotation.Autowired;
@ -22,6 +24,9 @@ public class SalesEstimateServiceImpl implements ISalesEstimateService
@Autowired
private SalesEstimateMapper salesEstimateMapper;
@Autowired
private RedisCache redisCache;
/**
* 查询销售估价
*
@ -123,4 +128,9 @@ public class SalesEstimateServiceImpl implements ISalesEstimateService
{
return salesEstimateMapper.restoreSalesEstimateById(aftersalesEstimateId);
}
@Override
public Object getId() {
return redisCache.generateBillNo("GJ");
}
}

126
ruoyi-admin/src/main/java/com/ruoyi/sales/service/impl/SysSalesEstimateChildServiceImpl.java

@ -0,0 +1,126 @@
package com.ruoyi.sales.service.impl;
import java.util.List;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.ShiroUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.sales.mapper.SysSalesEstimateChildMapper;
import com.ruoyi.sales.domain.SysSalesEstimateChild;
import com.ruoyi.sales.service.ISysSalesEstimateChildService;
import com.ruoyi.common.core.text.Convert;
/**
* 销售物料估价Service业务层处理
*
* @author zhang
* @date 2024-05-27
*/
@Service
public class SysSalesEstimateChildServiceImpl implements ISysSalesEstimateChildService
{
@Autowired
private SysSalesEstimateChildMapper sysSalesEstimateChildMapper;
/**
* 查询销售物料估价
*
* @param id 销售物料估价ID
* @return 销售物料估价
*/
@Override
public SysSalesEstimateChild selectSysSalesEstimateChildById(Long id)
{
return sysSalesEstimateChildMapper.selectSysSalesEstimateChildById(id);
}
/**
* 查询销售物料估价列表
*
* @param sysSalesEstimateChild 销售物料估价
* @return 销售物料估价
*/
@Override
public List<SysSalesEstimateChild> selectSysSalesEstimateChildList(SysSalesEstimateChild sysSalesEstimateChild)
{
return sysSalesEstimateChildMapper.selectSysSalesEstimateChildList(sysSalesEstimateChild);
}
/**
* 新增销售物料估价
*
* @param sysSalesEstimateChild 销售物料估价
* @return 结果
*/
@Override
public int insertSysSalesEstimateChild(SysSalesEstimateChild sysSalesEstimateChild)
{
String loginName = ShiroUtils.getLoginName();
sysSalesEstimateChild.setCreateBy(loginName);
sysSalesEstimateChild.setCreateTime(DateUtils.getNowDate());
return sysSalesEstimateChildMapper.insertSysSalesEstimateChild(sysSalesEstimateChild);
}
/**
* 修改销售物料估价
*
* @param sysSalesEstimateChild 销售物料估价
* @return 结果
*/
@Override
public int updateSysSalesEstimateChild(SysSalesEstimateChild sysSalesEstimateChild)
{
String loginName = ShiroUtils.getLoginName();
sysSalesEstimateChild.setUpdateBy(loginName);
sysSalesEstimateChild.setUpdateTime(DateUtils.getNowDate());
return sysSalesEstimateChildMapper.updateSysSalesEstimateChild(sysSalesEstimateChild);
}
/**
* 删除销售物料估价对象
*
* @param ids 需要删除的数据ID
* @return 结果
*/
@Override
public int deleteSysSalesEstimateChildByIds(String ids)
{
return sysSalesEstimateChildMapper.deleteSysSalesEstimateChildByIds(Convert.toStrArray(ids));
}
/**
* 删除销售物料估价信息
*
* @param id 销售物料估价ID
* @return 结果
*/
@Override
public int deleteSysSalesEstimateChildById(Long id)
{
return sysSalesEstimateChildMapper.deleteSysSalesEstimateChildById(id);
}
/**
* 作废销售物料估价
*
* @param id 销售物料估价ID
* @return 结果
*/
@Override
public int cancelSysSalesEstimateChildById(Long id)
{
return sysSalesEstimateChildMapper.cancelSysSalesEstimateChildById(id);
}
/**
* 恢复销售物料估价信息
*
* @param id 销售物料估价ID
* @return 结果
*/
@Override
public int restoreSysSalesEstimateChildById(Long id)
{
return sysSalesEstimateChildMapper.restoreSysSalesEstimateChildById(id);
}
}

213
ruoyi-admin/src/main/resources/mapper/sales/SysSalesEstimateChildMapper.xml

@ -0,0 +1,213 @@
<?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.system.mapper.SysSalesEstimateChildMapper">
<resultMap type="SysSalesEstimateChild" id="SysSalesEstimateChildResult">
<result property="id" column="id" />
<result property="quoteId" column="quoteId" />
<result property="materialId" column="materialId" />
<result property="materialCode" column="materialCode" />
<result property="materialName" column="materialName" />
<result property="materialBom" column="materialBom" />
<result property="materialType" column="materialType" />
<result property="processMethod" column="processMethod" />
<result property="brand" column="brand" />
<result property="photoUrl" column="photoUrl" />
<result property="unit" column="unit" />
<result property="describe" column="describe" />
<result property="countTax" column="countTax" />
<result property="usdTax" column="usdTax" />
<result property="materialNum" column="materialNum" />
<result property="materialSole" column="materialSole" />
<result property="materialRmb" column="materialRmb" />
<result property="materialNoRmb" column="materialNoRmb" />
<result property="materialRmbSum" column="materialRmbSum" />
<result property="materialNoRmbSum" column="materialNoRmbSum" />
<result property="materialNoUsd" column="materialNoUsd" />
<result property="materialUsd" column="materialUsd" />
<result property="materialNoUsdSum" column="materialNoUsdSum" />
<result property="materialUsdSum" column="materialUsdSum" />
<result property="deliveryTime" column="delivery_time" />
<result property="expiryDay" column="expiry_day" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
<result property="remark" column="remark" />
<result property="useStatus" column="use_status" />
<result property="auditStatus" column="audit_status" />
<result property="outBoundQuantity" column="out_bound_quantity" />
<result property="unBoundQuantity" column="un_bound_quantity" />
</resultMap>
<sql id="selectSysSalesEstimateChildVo">
select id, quoteId, materialId, materialCode, materialName, materialBom, materialType, processMethod, brand, photoUrl, unit, describe, countTax, usdTax, materialNum, materialSole, materialRmb, materialNoRmb, materialRmbSum, materialNoRmbSum, materialNoUsd, materialUsd, materialNoUsdSum, materialUsdSum, delivery_time, expiry_day, create_by, create_time, update_by, update_time, remark, use_status, audit_status, out_bound_quantity, un_bound_quantity from sys_sales_estimate_child
</sql>
<select id="selectSysSalesEstimateChildList" parameterType="SysSalesEstimateChild" resultMap="SysSalesEstimateChildResult">
<include refid="selectSysSalesEstimateChildVo"/>
<where>
<if test="quoteId != null and quoteId != ''"> and quoteId = #{quoteId}</if>
<if test="materialId != null "> and materialId = #{materialId}</if>
<if test="materialCode != null and materialCode != ''"> and materialCode = #{materialCode}</if>
<if test="materialName != null and materialName != ''"> and materialName like concat('%', #{materialName}, '%')</if>
<if test="materialBom != null and materialBom != ''"> and materialBom = #{materialBom}</if>
<if test="materialType != null and materialType != ''"> and materialType = #{materialType}</if>
<if test="processMethod != null and processMethod != ''"> and processMethod = #{processMethod}</if>
<if test="brand != null and brand != ''"> and brand = #{brand}</if>
<if test="photoUrl != null and photoUrl != ''"> and photoUrl = #{photoUrl}</if>
<if test="unit != null and unit != ''"> and unit = #{unit}</if>
<if test="describe != null and describe != ''"> and describe = #{describe}</if>
<if test="deliveryTime != null "> and delivery_time = #{deliveryTime}</if>
<if test="expiryDay != null and expiryDay != ''"> and expiry_day = #{expiryDay}</if>
<if test="params.beginCreateTime != null and params.beginCreateTime != '' and params.endCreateTime != null and params.endCreateTime != ''"> and create_time between #{params.beginCreateTime} and #{params.endCreateTime}</if>
<if test="params.beginUpdateTime != null and params.beginUpdateTime != '' and params.endUpdateTime != null and params.endUpdateTime != ''"> and update_time between #{params.beginUpdateTime} and #{params.endUpdateTime}</if>
<if test="useStatus != null and useStatus != ''"> and use_status = #{useStatus}</if>
<if test="auditStatus != null and auditStatus != ''"> and audit_status = #{auditStatus}</if>
</where>
</select>
<select id="selectSysSalesEstimateChildById" parameterType="Long" resultMap="SysSalesEstimateChildResult">
<include refid="selectSysSalesEstimateChildVo"/>
where id = #{id}
</select>
<insert id="insertSysSalesEstimateChild" parameterType="SysSalesEstimateChild" useGeneratedKeys="true" keyProperty="id">
insert into sys_sales_estimate_child
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="quoteId != null">quoteId,</if>
<if test="materialId != null">materialId,</if>
<if test="materialCode != null">materialCode,</if>
<if test="materialName != null">materialName,</if>
<if test="materialBom != null">materialBom,</if>
<if test="materialType != null">materialType,</if>
<if test="processMethod != null">processMethod,</if>
<if test="brand != null">brand,</if>
<if test="photoUrl != null">photoUrl,</if>
<if test="unit != null">unit,</if>
<if test="describe != null">describe,</if>
<if test="countTax != null">countTax,</if>
<if test="usdTax != null">usdTax,</if>
<if test="materialNum != null">materialNum,</if>
<if test="materialSole != null">materialSole,</if>
<if test="materialRmb != null">materialRmb,</if>
<if test="materialNoRmb != null">materialNoRmb,</if>
<if test="materialRmbSum != null">materialRmbSum,</if>
<if test="materialNoRmbSum != null">materialNoRmbSum,</if>
<if test="materialNoUsd != null">materialNoUsd,</if>
<if test="materialUsd != null">materialUsd,</if>
<if test="materialNoUsdSum != null">materialNoUsdSum,</if>
<if test="materialUsdSum != null">materialUsdSum,</if>
<if test="deliveryTime != null">delivery_time,</if>
<if test="expiryDay != null">expiry_day,</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>
<if test="remark != null">remark,</if>
<if test="useStatus != null">use_status,</if>
<if test="auditStatus != null">audit_status,</if>
<if test="outBoundQuantity != null">out_bound_quantity,</if>
<if test="unBoundQuantity != null">un_bound_quantity,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="quoteId != null">#{quoteId},</if>
<if test="materialId != null">#{materialId},</if>
<if test="materialCode != null">#{materialCode},</if>
<if test="materialName != null">#{materialName},</if>
<if test="materialBom != null">#{materialBom},</if>
<if test="materialType != null">#{materialType},</if>
<if test="processMethod != null">#{processMethod},</if>
<if test="brand != null">#{brand},</if>
<if test="photoUrl != null">#{photoUrl},</if>
<if test="unit != null">#{unit},</if>
<if test="describe != null">#{describe},</if>
<if test="countTax != null">#{countTax},</if>
<if test="usdTax != null">#{usdTax},</if>
<if test="materialNum != null">#{materialNum},</if>
<if test="materialSole != null">#{materialSole},</if>
<if test="materialRmb != null">#{materialRmb},</if>
<if test="materialNoRmb != null">#{materialNoRmb},</if>
<if test="materialRmbSum != null">#{materialRmbSum},</if>
<if test="materialNoRmbSum != null">#{materialNoRmbSum},</if>
<if test="materialNoUsd != null">#{materialNoUsd},</if>
<if test="materialUsd != null">#{materialUsd},</if>
<if test="materialNoUsdSum != null">#{materialNoUsdSum},</if>
<if test="materialUsdSum != null">#{materialUsdSum},</if>
<if test="deliveryTime != null">#{deliveryTime},</if>
<if test="expiryDay != null">#{expiryDay},</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>
<if test="remark != null">#{remark},</if>
<if test="useStatus != null">#{useStatus},</if>
<if test="auditStatus != null">#{auditStatus},</if>
<if test="outBoundQuantity != null">#{outBoundQuantity},</if>
<if test="unBoundQuantity != null">#{unBoundQuantity},</if>
</trim>
</insert>
<update id="updateSysSalesEstimateChild" parameterType="SysSalesEstimateChild">
update sys_sales_estimate_child
<trim prefix="SET" suffixOverrides=",">
<if test="quoteId != null">quoteId = #{quoteId},</if>
<if test="materialId != null">materialId = #{materialId},</if>
<if test="materialCode != null">materialCode = #{materialCode},</if>
<if test="materialName != null">materialName = #{materialName},</if>
<if test="materialBom != null">materialBom = #{materialBom},</if>
<if test="materialType != null">materialType = #{materialType},</if>
<if test="processMethod != null">processMethod = #{processMethod},</if>
<if test="brand != null">brand = #{brand},</if>
<if test="photoUrl != null">photoUrl = #{photoUrl},</if>
<if test="unit != null">unit = #{unit},</if>
<if test="describe != null">describe = #{describe},</if>
<if test="countTax != null">countTax = #{countTax},</if>
<if test="usdTax != null">usdTax = #{usdTax},</if>
<if test="materialNum != null">materialNum = #{materialNum},</if>
<if test="materialSole != null">materialSole = #{materialSole},</if>
<if test="materialRmb != null">materialRmb = #{materialRmb},</if>
<if test="materialNoRmb != null">materialNoRmb = #{materialNoRmb},</if>
<if test="materialRmbSum != null">materialRmbSum = #{materialRmbSum},</if>
<if test="materialNoRmbSum != null">materialNoRmbSum = #{materialNoRmbSum},</if>
<if test="materialNoUsd != null">materialNoUsd = #{materialNoUsd},</if>
<if test="materialUsd != null">materialUsd = #{materialUsd},</if>
<if test="materialNoUsdSum != null">materialNoUsdSum = #{materialNoUsdSum},</if>
<if test="materialUsdSum != null">materialUsdSum = #{materialUsdSum},</if>
<if test="deliveryTime != null">delivery_time = #{deliveryTime},</if>
<if test="expiryDay != null">expiry_day = #{expiryDay},</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>
<if test="remark != null">remark = #{remark},</if>
<if test="useStatus != null">use_status = #{useStatus},</if>
<if test="auditStatus != null">audit_status = #{auditStatus},</if>
<if test="outBoundQuantity != null">out_bound_quantity = #{outBoundQuantity},</if>
<if test="unBoundQuantity != null">un_bound_quantity = #{unBoundQuantity},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteSysSalesEstimateChildById" parameterType="Long">
delete from sys_sales_estimate_child where id = #{id}
</delete>
<delete id="deleteSysSalesEstimateChildByIds" parameterType="String">
delete from sys_sales_estimate_child where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
<update id="cancelSysSalesEstimateChildById" parameterType="Long">
update sys_sales_estimate_child set del_flag = '1' where id = #{id}
</update>
<update id="restoreSysSalesEstimateChildById" parameterType="Long">
update sys_sales_estimate_child set del_flag = '0' where id = #{id}
</update>
</mapper>

314
ruoyi-admin/src/main/resources/templates/sales/EstimateChild/EstimateChild.html

@ -0,0 +1,314 @@
<!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="quoteId"/>
</li>
<li>
<label>物料表中的id:</label>
<input type="text" name="materialId"/>
</li>
<li>
<label>物料表中的编号:</label>
<input type="text" name="materialCode"/>
</li>
<li>
<label>物料的名称:</label>
<input type="text" name="materialName"/>
</li>
<li>
<label>物料相关的BOM编号:</label>
<input type="text" name="materialBom"/>
</li>
<li>
<label>物料的类型:</label>
<select name="materialType">
<option value="">所有</option>
<option value="-1">代码生成请选择字典属性</option>
</select>
</li>
<li>
<label>物料的加工方式:</label>
<input type="text" name="processMethod"/>
</li>
<li>
<label>物料的品牌:</label>
<input type="text" name="brand"/>
</li>
<li>
<label>物料的图片:</label>
<input type="text" name="photoUrl"/>
</li>
<li>
<label>单位:</label>
<input type="text" name="unit"/>
</li>
<li>
<label>物料的描述:</label>
<input type="text" name="describe"/>
</li>
<li>
<label>计划交付时间:</label>
<input type="text" class="time-input" placeholder="请选择计划交付时间" name="deliveryTime"/>
</li>
<li>
<label>质保天数:</label>
<input type="text" name="expiryDay"/>
</li>
<li class="select-time">
<label>创建时间:</label>
<input type="text" class="time-input" id="startTime" placeholder="开始时间" name="params[beginCreateTime]"/>
<span>-</span>
<input type="text" class="time-input" id="endTime" placeholder="结束时间" name="params[endCreateTime]"/>
</li>
<li class="select-time">
<label>修改时间:</label>
<input type="text" class="time-input" id="startTime" placeholder="开始时间" name="params[beginUpdateTime]"/>
<span>-</span>
<input type="text" class="time-input" id="endTime" placeholder="结束时间" name="params[endUpdateTime]"/>
</li>
<li>
<label>删除状态:</label>
<select name="useStatus" th:with="type=${@dict.getType('useStatus')}">
<option value="">所有</option>
<option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
</select>
</li>
<li>
<label>审核状态:</label>
<select name="auditStatus" th:with="type=${@dict.getType('auditStatus')}">
<option value="">所有</option>
<option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
</select>
</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="sales:EstimateChild:add">
<i class="fa fa-plus"></i> 添加
</a>
<a class="btn btn-primary single disabled" onclick="$.operate.edit()" shiro:hasPermission="sales:EstimateChild:edit">
<i class="fa fa-edit"></i> 修改
</a>
<a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()" shiro:hasPermission="sales:EstimateChild:remove">
<i class="fa fa-remove"></i> 删除
</a>
<a class="btn btn-warning" onclick="$.table.exportExcel()" shiro:hasPermission="sales:EstimateChild: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('sales:EstimateChild:edit')}]];
var removeFlag = [[${@permission.hasPermi('sales:EstimateChild:remove')}]];
var cancelFlag = [[${@permission.hasPermi('sales:EstimateChild:cancel')}]];
var restoreFlag = [[${@permission.hasPermi('sales:EstimateChild:restore')}]];
var useStatusDatas = [[${@dict.getType('useStatus')}]];
var auditStatusDatas = [[${@dict.getType('auditStatus')}]];
var prefix = ctx + "sales/EstimateChild";
$(function() {
var options = {
url: prefix + "/list",
createUrl: prefix + "/add",
updateUrl: prefix + "/edit/{id}",
removeUrl: prefix + "/remove",
cancelUrl: prefix + "/cancel/{id}",
restoreUrl: prefix + "/restore/{id}",
exportUrl: prefix + "/export",
modalName: "销售物料估价",
columns: [{
checkbox: true
},
{
title: '销售估价子表id',
field: 'id',
visible: false
},
{
title: '关联销售估价编号',
field: 'quoteId',
sort: true
},
{
title: '物料表中的id',
field: 'materialId',
sort: true
},
{
title: '物料表中的编号',
field: 'materialCode',
sort: true
},
{
title: '物料的名称',
field: 'materialName',
sort: true
},
{
title: '物料相关的BOM编号',
field: 'materialBom',
sort: true
},
{
title: '物料的类型',
field: 'materialType',
sort: true
},
{
title: '物料的加工方式',
field: 'processMethod',
sort: true
},
{
title: '物料的品牌',
field: 'brand',
sort: true
},
{
title: '物料的图片',
field: 'photoUrl',
sort: true
},
{
title: '单位',
field: 'unit',
sort: true
},
{
title: '物料的描述',
field: 'describe',
sort: true
},
{
title: '国内税率',
field: 'countTax',
sort: true
},
{
title: '美元汇率',
field: 'usdTax',
sort: true
},
{
title: '物料的数量',
field: 'materialNum',
sort: true
},
{
title: '物料的对外报价',
field: 'materialSole',
sort: true
},
{
title: '物料的不含税单价(RMB)',
field: 'materialRmb',
sort: true
},
{
title: '物料的含税单价(RMB)',
field: 'materialNoRmb',
sort: true
},
{
title: '物料的不含税总价(RMB)',
field: 'materialRmbSum',
sort: true
},
{
title: '物料的含税总价(RMB)',
field: 'materialNoRmbSum',
sort: true
},
{
title: '物料的不含税单价(美元)',
field: 'materialNoUsd',
sort: true
},
{
title: '物料的含税单价(美元)',
field: 'materialUsd',
sort: true
},
{
title: '物料的不含税总价(美元)',
field: 'materialNoUsdSum',
sort: true
},
{
title: '物料的含税总价(美元)',
field: 'materialUsdSum',
sort: true
},
{
title: '计划交付时间',
field: 'deliveryTime',
sort: true
},
{
title: '质保天数',
field: 'expiryDay',
sort: true
},
{
title: '备注',
field: 'remark',
sort: true
},
{
title: '删除状态',
field: 'useStatus',
formatter: function(value, row, index) {
return $.table.selectDictLabel(useStatusDatas, value);
}
},
{
title: '审核状态',
field: 'auditStatus',
formatter: function(value, row, index) {
return $.table.selectDictLabel(auditStatusDatas, value);
}
},
{
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> ');
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> ');
}
return actions.join('');
}
}]
};
$.table.init(options);
});
</script>
</body>
</html>

211
ruoyi-admin/src/main/resources/templates/sales/EstimateChild/add.html

@ -0,0 +1,211 @@
<!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-EstimateChild-add">
<div class="form-group">
<label class="col-sm-3 control-label">关联销售估价编号:</label>
<div class="col-sm-8">
<input name="quoteId" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">物料表中的id:</label>
<div class="col-sm-8">
<input name="materialId" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">物料表中的编号:</label>
<div class="col-sm-8">
<input name="materialCode" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">物料的名称:</label>
<div class="col-sm-8">
<input name="materialName" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">物料相关的BOM编号:</label>
<div class="col-sm-8">
<input name="materialBom" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">物料的类型:</label>
<div class="col-sm-8">
<select name="materialType" class="form-control m-b">
<option value="">所有</option>
</select>
<span class="help-block m-b-none"><i class="fa fa-info-circle"></i> 代码生成请选择字典属性</span>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">物料的加工方式:</label>
<div class="col-sm-8">
<input name="processMethod" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">物料的品牌:</label>
<div class="col-sm-8">
<input name="brand" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">物料的图片:</label>
<div class="col-sm-8">
<input name="photoUrl" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">单位:</label>
<div class="col-sm-8">
<input name="unit" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">物料的描述:</label>
<div class="col-sm-8">
<input name="describe" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">国内税率:</label>
<div class="col-sm-8">
<input name="countTax" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">美元汇率:</label>
<div class="col-sm-8">
<input name="usdTax" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">物料的数量:</label>
<div class="col-sm-8">
<input name="materialNum" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">物料的对外报价:</label>
<div class="col-sm-8">
<input name="materialSole" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">物料的不含税单价(RMB):</label>
<div class="col-sm-8">
<input name="materialRmb" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">物料的含税单价(RMB):</label>
<div class="col-sm-8">
<input name="materialNoRmb" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">物料的不含税总价(RMB):</label>
<div class="col-sm-8">
<input name="materialRmbSum" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">物料的含税总价(RMB):</label>
<div class="col-sm-8">
<input name="materialNoRmbSum" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">物料的不含税单价(美元):</label>
<div class="col-sm-8">
<input name="materialNoUsd" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">物料的含税单价(美元):</label>
<div class="col-sm-8">
<input name="materialUsd" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">物料的不含税总价(美元):</label>
<div class="col-sm-8">
<input name="materialNoUsdSum" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">物料的含税总价(美元):</label>
<div class="col-sm-8">
<input name="materialUsdSum" class="form-control" type="text">
</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="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 class="form-group">
<label class="col-sm-3 control-label">质保天数:</label>
<div class="col-sm-8">
<input name="expiryDay" class="form-control" type="text">
</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"></textarea>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">删除状态:</label>
<div class="col-sm-8">
<select name="useStatus" class="form-control m-b" th:with="type=${@dict.getType('useStatus')}">
<option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">审核状态:</label>
<div class="col-sm-8">
<select name="auditStatus" class="form-control m-b" th:with="type=${@dict.getType('auditStatus')}">
<option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
</select>
</div>
</div>
</form>
</div>
<th:block th:include="include :: footer" />
<th:block th:include="include :: datetimepicker-js" />
<script th:inline="javascript">
var prefix = ctx + "sales/EstimateChild"
$("#form-EstimateChild-add").validate({
focusCleanup: true
});
function submitHandler() {
if ($.validate.form()) {
$.operate.save(prefix + "/add", $('#form-EstimateChild-add').serialize());
}
}
$("input[name='deliveryTime']").datetimepicker({
format: "yyyy-mm-dd",
minView: "month",
autoclose: true
});
</script>
</body>
</html>

655
ruoyi-admin/src/main/resources/templates/sales/salesEstimate/add.html

@ -3,163 +3,607 @@
<head>
<th:block th:include="include :: header('新增销售估价')" />
<th:block th:include="include :: datetimepicker-css" />
<th:block th:include="include :: select2-css" />
<th:block th:include="include :: bootstrap-fileinput-css" />
</head>
<body class="white-bg">
<div class="wrapper wrapper-content animated fadeInRight ibox-content">
<form class="form-horizontal m" id="form-salesEstimate-add">
<div class="form-group">
<div class="form-group" hidden="hidden">
<label class="col-sm-3 control-label">估价单号:</label>
<div class="col-sm-8">
<input name="aftersalesEstimateCode" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">用户ID</label>
<div class="form-group" shiro:hasPermission="system:estimate:edit">
<label class="col-sm-4 control-label">业务员</label>
<div class="col-sm-8">
<input name="userId" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">估价状态:</label>
<div class="col-sm-8">
<select name="estimateStatus" class="form-control m-b" th:with="type=${@dict.getType('estimate_status')}">
<option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
<select class="form-control" name="businessMembers" required>
<option value="">请选择</option>
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">客户代码:</label>
<div class="col-sm-8">
<input name="enterpriseCode" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">客户名称:</label>
<div class="col-sm-8">
<input name="enterpriseName" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">料号:</label>
<div class="col-sm-8">
<input name="materialNo" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">物料名称:</label>
<div class="col-sm-8">
<input name="materialName" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">物料合计:</label>
<div class="col-sm-8">
<input name="materialSum" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">数量合计:</label>
<div class="col-sm-8">
<input name="quantitySum" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">估价币种:</label>
<div class="col-sm-8">
<input name="estimateCurrencies" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">不含税总价:</label>
<div class="col-sm-8">
<input name="allPriceExcludingTaxRmb" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">含税总价:</label>
<div class="col-sm-8">
<input name="allPriceIncludesTax" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">不含税总价:</label>
<div class="form-group">
<label class="col-sm-4 control-label">客户编号:</label>
<div class="col-sm-8">
<input name="allPriceExcludingTaxDollar" class="form-control" type="text">
<select class="form-control" name="customerCode" required>
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">流程实例ID</label>
<div class="form-group">
<label class="col-sm-4 control-label">客户名称:</label>
<div class="col-sm-8">
<input name="instanceId" class="form-control" type="text">
<input name="customerName" class="form-control m-b" type="text" readonly />
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">流程实例类型</label>
<div class="form-group">
<label class="col-sm-4 control-label">估价币种:</label>
<div class="col-sm-8">
<select name="instanceType" class="form-control m-b">
<option value="">所有</option>
<select class="form-control" id="commonCurrency_add" name="commonCurrency" th:with="dictList=${@dict.getType('sys_common_currency')}" required>
<option th:each="dict : ${dictList}" th:value="${dict.dictValue}" th:text="${dict.dictLabel}"></option>
</select>
<span class="help-block m-b-none"><i class="fa fa-info-circle"></i> 代码生成请选择字典属性</span>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">流程提交实例ID</label>
<div class="form-group">
<label class="col-sm-4 control-label">美元汇率:</label>
<div class="col-sm-8">
<input name="submitInstanceId" class="form-control" type="text">
<input name="usdTax" id="usdTax_add" class="form-control" type="number" placeholder="美元对人民币汇率">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">申请标题</label>
<div class="form-group">
<label class="col-sm-4 control-label">国内税率:</label>
<div class="col-sm-8">
<input name="applyTitle" class="form-control" type="text">
<div class="input-group">
<input name="rmbTax" id="rmbTax_add" class="form-control" type="number" placeholder="13" />
<span class="input-group-addon">%</span>
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">申请时间</label>
<div class="form-group">
<label class="col-sm-4 control-label">订价日期:</label>
<div class="col-sm-8">
<div class="input-group date">
<input name="applyTime" class="form-control" placeholder="yyyy-MM-dd" type="text">
<input name="pricingDate" 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 class="form-group">
<label class="col-sm-3 control-label">申请人</label>
<div class="form-group">
<label class="col-sm-4 control-label">备注说明:</label>
<div class="col-sm-8">
<input name="applyUser" class="form-control" type="text">
<textarea readonly name="remark" class="form-control"></textarea>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">流程作废实例ID:</label>
<div class="col-sm-8">
<input name="cancelInstanceId" class="form-control" type="text">
<div class="container">
<h4 class="form-header h4">计算</h4>
<div class="row">
<div class="col-md-5">
<label class="col-sm-4">物料合计:</label>
<input class="col-sm-2" name="materialSum" id="materialSum_add" type="text" readonly hidden="hidden"/>
</div>
<div class="col-md-5">
<label class="col-sm-4">数量合计:</label>
<input class="col-sm-2" name="quantitySum" id="quantitySum_add" type="number" hidden="hidden" readonly/>
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">流程恢复实例ID:</label>
<div class="col-sm-8">
<input name="restoreInstanceId" class="form-control" type="text">
<div class="row">
<div class="col-xs-3">
<label class="col-sm-8">不含税单价:</label>
<input placeholder="RMB" class="col-sm-1" name="noRmbPrice" id="noRmb_add" hidden="hidden" type="number" readonly/>
<span></span>RMB
</div>
<div class="col-xs-3">
<label class="col-sm-8">含税单价:</label>
<input placeholder="RMB" class="col-sm-1" name="rmbPrice" id="rmb_add" hidden="hidden" type="number" readonly/>
<span></span>RMB
</div>
<div class="col-xs-3">
<label class="col-sm-8">不含税总价:</label>
<input placeholder="RMB" class="col-sm-1" name="noRmbSumPrice" id="noRmbSum_add" hidden="hidden" type="number" readonly/>
<span></span>RMB
</div>
<div class="col-xs-3">
<label class="col-sm-8">含税总价:</label>
<input placeholder="RMB" class="col-sm-1" name="rmbTaxSum" id="rmbTaxSum_add" hidden="hidden" type="number" readonly/>
<span></span>RMB
</div>
</div>
</div>
<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 class="row">
<div class="col-xs-3">
<label class="col-sm-8">不含税单价:</label>
<input placeholder="美元" class="col-sm-2" name="noUsdPrice" id="noUsd_add" hidden="hidden" type="number" readonly/>
<span></span>美元
</div>
<div class="col-xs-3">
<label class="col-sm-8">含税单价:</label>
<input placeholder="美元" class="col-sm-2" name="usdPrice" id="usd_add" hidden="hidden" type="number" readonly/>
<span></span>美元
</div>
<div class="col-xs-3">
<label class="col-sm-8">不含税总价:</label>
<input placeholder="美元" class="col-sm-2" name="noUsdSum" id="noUsdSum_add" hidden="hidden" type="number" readonly/>
<span></span>美元
</div>
<div class="col-xs-3">
<label class="col-sm-8">含税总价:</label>
<input placeholder="美元" class="col-sm-2" name="usdTaxSum" id="usdSum_add" hidden="hidden" type="number" readonly/>
<span></span>美元
</div>
</div>
</div>
</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>
<a class="btn btn-danger multiple disabled" onclick="insertNRow()">
<i class="fa fa-remove"></i> 添加无料号物料
</a>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12 select-table table-striped">
<table id="bootstrap-sub-table-estimateChild"></table>
</div>
</div>
</div>
<th:block th:include="include :: footer" />
<th:block th:include="include :: datetimepicker-js" />
<th:block th:include="include :: bootstrap-table-editable-js" />
<th:block th:include="include :: select2-js" />
<script th:inline="javascript">
var prefix = ctx + "sales/salesEstimate"
$("#form-salesEstimate-add").validate({
focusCleanup: true
var userName = [[${@permission.getPrincipalProperty('userName')}]];
$("#form-salesEstimate-add").validate({focusCleanup: true});
//获取客户信息
$(function(){
$("select[name='customerCode']").select2({
theme: "bootstrap",
allowClear: true,
placeholder: "请选择客户",
ajax:{
type: "post",
url:ctx + "system/customer/customerList",
dataType:"json",
delay:250,
cache:true,
processResults: function (res, params) {
var resultList = res.rows;
console.log("传输的数值");
console.log(resultList);
var options = [];
for(var i= 0, len=resultList.length;i<len;i++){
var option = resultList[i];
option.id = resultList[i]["enterpriseCode"];
option.text = resultList[i]["enterpriseCode"];
options.push(option);
}
return {
results: options,
pagination: {
}
};
},
escapeMarkup: function (markup) { return markup; },
// minimumInputLength: 1
}
});
})
$('#customerCode').on('select2:select', function (e) {
var data = e.params.data;
$("input[name='customerName']").val(data.enterpriseName);
$("select[name='commonCurrency']").val(data.commonCurrency).trigger('change');
$("input[name='rmbTax']").val(data.taxRate);
$("#commonCurrency_add").val(data.commonCurrency).trigger('change');
commonCurrency = $("#commonCurrency_add option:selected").val();
});
$(function() {
var options = {
id:'bootstrap-sub-table-estimateChild',
// url: ctx + "system/estimateChild/list",
pagination: false,
sidePagination: "client",
model: "物料报价信息",
columns: [
{checkbox: true},
{field: 'index',align: 'center', title: "序号",
formatter: function (value, row, index) {
var columnIndex = $.common.sprintf("<input type='hidden' name='index' value='%s'>", $.table.serialNumber(index));
return columnIndex + $.table.serialNumber(index);
}
},
{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) {
if(value == null || value == ""){
value = "";
return "<img src='' herf='' />";
}
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',
editable: {
type: 'number',
mode: 'inline',
title: '对外售价',
validate: function (value) {
if (!value) {
return '对外售价不能为空';
}
if (isNaN(value)) {
return '对外售价必须为数字';
}
}
}
},
{title: '国内税率',field: 'countTax',align: 'center',},
{ title: '美元汇率',field: 'usdTax', align: 'center',},
{field: 'materialNum',align: 'center',title: '物料的数量',
editable:{
type : 'text',
mode: 'inline',
title : '物料的数量',
validate : function(value) {
if (!value) {
return '用量不能为空';
}
if (isNaN(value)) {
return '用量必须为数字';
}
}
},
},
{ title: '物料的不含税单价(RMB)',
field: 'materialNoRmb',
align: 'center',
editable:{
type: 'text', // 使用'text'类型,因为我们需自定义验证小数
mode: 'inline',
enabled: function() {
return ($("#commonCurrency_add").val() === '1'); // 当货币类型为2时启用
},
title: '物料的不含税单价(RMB)',
validate: function(value) {
// 验证是否为空
if (!value) {
return '金额不能为空';
}
// 尝试转换为浮点数并检查是否成功
var num = parseFloat(value);
if (isNaN(num)) {
return '请输入有效的数字';
}
// 检查小数点后是否有超过两位的数字
var decimalPart = num.toString().split('.')[1]; // 获取小数部分
if (decimalPart && decimalPart.length > 2) {
return '请输入精确到小数点后两位的数字';
}
}
}
},
{title: '物料的不含税单价(美元)',
field: 'materialNoUsd',
align: 'center',
editable: {
type: 'text', // 使用'text'类型,因为我们需自定义验证小数
mode: 'inline',
enabled: function() {
return ($("#commonCurrency_add").val() === '2'); // 当货币类型为2时启用
},
title: '物料的不含税单价(美元)',
validate: function(value) {
// 验证是否为空
if (!value) {
return '金额不能为空';
}
// 尝试转换为浮点数并检查是否成功
var num = parseFloat(value);
if (isNaN(num)) {
return '请输入有效的数字';
}
// 检查小数点后是否有超过两位的数字
var decimalPart = num.toString().split('.')[1]; // 获取小数部分
if (decimalPart && decimalPart.length > 2) {
return '请输入精确到小数点后两位的数字';
}
}
}
},
{ title: '物料的含税单价(美元)',field: 'materialUsd',align: 'center',},
{ title: '物料的含税总价(美元)',field: 'materialUsdSum', align: 'center',},
{ title: '物料的不含税总价(美元)',field: 'materialNoUsdSum',align: 'center',},
{ title: '物料的含税总价(RMB)',field: 'materialNoRmbSum',align: 'center',},
{title: '物料的不含税总价(RMB)',field: 'materialRmbSum',align: 'center',},
{field: 'createBy', align: 'center',title: '录入人',visible: false},
{field: 'createTime',align: 'center',title: '录入时间',visible: false},
{field: 'updateBy',align: 'center',title: '更新人',visible: false},
{field: 'updateTime',align: 'center',title: '上次更新时间',visible: false},
{field: 'remark',align: 'center',title: '备注',visible: false},
{field: 'auditStatus',align: 'center',title: '审核状态',visible: false,
formatter: function(value, row, index) {return $.table.selectDictLabel(auditStatusDatas, value);}
},
{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.id + '\')"><i class="fa fa-remove"></i>删除</a> ');
return actions.join('');
}
}
],
onEditableSave:function(field, row, oldValue, $el){
var commonCurrency1 = $("#commonCurrency_add option:selected").val();
var rmb1 = $("#rmbTax_add").val();
if (rmb1 =='' || rmb1== null){
rmb1 = 0;
}else{
rmb1 = $("#rmbTax_add").val();
}
var rmb = parseFloat(rmb1);
var usd = $("#usdTax_add").val();
if (usd =='' || usd== null){
usd = 0;
}else{
usd = parseFloat(usd);
}
console.log(commonCurrency1);
if(commonCurrency1 == 1){
row.materialNoRmb = parseFloat(row.materialNoRmb).toFixed(2);
row.materialRmb = parseFloat(row.materialNoRmb * parseFloat(1 + rmb)).toFixed(2);
row.materialNoRmbSum = parseFloat(row.materialNum * parseFloat(row.materialNoRmb)).toFixed(2);
row.materialRmbSum = parseFloat(row.materialRmb * row.materialNum).toFixed(2);
row.materialNoUsd = parseFloat(row.materialNoRmb / usd).toFixed(2);
row.materialNoUsdSum = parseFloat(row.materialNum * row.materialNoUsd).toFixed(2);
row.materialUsd = parseFloat(row.materialNoUsd).toFixed(2);
row.materialUsdSum = parseFloat(row.materialNum * row.materialUsd).toFixed(2);
}
else if( commonCurrency1 == 2){
row.materialNoUsd = parseFloat(row.materialNoUsd).toFixed(2);
row.materialUsd = parseFloat(row.materialNoUsd).toFixed(2);
row.materialUsdSum = parseFloat(row.materialNum * row.materialUsd).toFixed(2);
row.materialNoUsdSum = parseFloat(row.materialNoUsd * row.materialNum).toFixed(2);
row.materialNoRmb = parseFloat(row.materialNoUsd * usd).toFixed(2);
row.materialRmb = parseFloat(row.materialNoRmb * (1 + rmb)).toFixed(2);
row.materialNoRmbSum = parseFloat(row.materialNoRmb * row.materialNum).toFixed(2);
row.materialRmbSum = parseFloat(row.materialRmb * row.materialNum).toFixed(2);
}
getTotalAmount()
},
};
$.table.init(options);
});
//获取单号
$.ajax({
url: prefix + "/getId",
type: "post",
dateType: "json",
success: function (resp) {
if (resp.code === 0) {
$("input[name='aftersalesEstimateCode']").val(resp.data);
} else {
$.modal.msgError("失败啦");
}
},
error: function () {
$.modal.msgError("后台出错啦!");
}
});
/*业务员列表*/
$.ajax({
url: ctx + 'system/salesOrder/getBinessMembers',
type: 'get',
success: function (res) {
console.log(res)
if (res.rows.length > 0) {
var usertData = res.rows;
for (let i in usertData) {
$("#form-salesEstimate-add select[name='businessMembers']").append(
"<option value='" + usertData[i].userName + "'>" + usertData[i].userName + "</option>");
}
$("#form-salesEstimate-add select[name='businessMembers']").val(userName).trigger("change");
} else {
$.modal.msgError(res.msg);
}
}
});
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-estimateChild").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,
countTax: '',
usdTax: '',
materialNum: "",
materialSole: "",
materialRmb: "",
materialNoRmb: "",
materialNoUsd: "",
materialUsd: "",
materialUsdSum: "",
materialNoUsdSum: "",
materialNoRmbSum: "",
materialRmbSum: "",
createBy: "",
createTime: "",
updateBy: "",
updateTime: "",
remark: "",
}
})
}
function insertRow() {
if ($("#customerCode").val() == null || $("#customerCode").val() == '') {
$.modal.alertWarning("请先选择客户");
return;
}
if ($("#rmbTax_add").val() == null || $("#rmbTax_add").val() == '') {
$.modal.alertWarning("请先选择输入国内的税率");
return;
}
var url = ctx + "erp/material/select";
var options = {
title: '选择料号',
url: url,
callBack: doSubmit
};
$.modal.openOptions(options);
}
/* 删除指定表格行 */
function removeRow(id){
$("#bootstrap-sub-table-estimateChild").bootstrapTable('remove', {
field: 'id',
values: id
})
}
$("input[name='pricingDate']").datetimepicker({
format: "yyyy-mm-dd",
minView: "month",
autoclose: true
});
//计算金额
function getTotalAmount() {
// 获取表格数据
const data = $("#bootstrap-sub-table-estimateChild").bootstrapTable('getData', true);
// 初始化汇总对象,减少代码重复并提高清晰度
const sums = {
enterprise: "", // 用于拼接物料名称和数量
enterpriseSum: 0, // 物料总数量
currencies: {
noRmb: { total: 0, single: 0 }, // 非人民币数量与总金额
rmb: { total: 0, single: 0 }, // 人民币
noUsd: { total: 0, single: 0 }, // 非美元
usd: { total: 0, single: 0 } // 美元
}
};
// 遍历数据进行计算
for (let i = 0; i < data.length; i++) {
const item = data[i];
// 拼接物料信息
sums.enterprise += "" + item.materialName + ": 数量 : " + item.materialNum;
sums.enterpriseSum += parseFloat(item.materialNum); // 累加物料数量
// 分别累加各货币的单个金额和总金额
['noRmb', 'rmb', 'noUsd', 'usd'].forEach(currency => {
sums.currencies[currency].single += parseFloat(item['material' + [currency] ]);
sums.currencies[currency].total += parseFloat(item['material' + [currency] + 'Sum']);
});
}
updateFormValues(sums);
}
function updateFormValues(sums) {
// 物料合计与数量合计没有在sums中直接给出,这里假设它们需要单独处理或已存在于页面其他部分
$("#enterprise_add").val(sums.enterprise);
$("#enterpriseSum_add").val(sums.enterpriseSum);
// 更新不含税单价和总价
$("#noRmb_add").val(sums.currencies.noRmb.single);
$("#noRmbSum_add").val(sums.currencies.noRmb.total);
$("#rmb_add").val(sums.currencies.rmb.single);
$("#rmbSum_add").val(sums.currencies.rmb.total);
$("#noUsd_add").val(sums.currencies.noUsd.single);
$("#noUsdSum_add").val(sums.currencies.noUsd.total);
$("#usd_add").val(sums.currencies.usd.single);
$("#usdSum_add").val(sums.currencies.usd.total);
}
$(document).ready(function() {
// 监听货币选项变化
$("#commonCurrency_add").on("change", function() {
var isEditable = $(this).val() === "1";
var fieldName = "";
var materialColumnCells = $('#bootstrap-sub-table-estimateChild tbody tr td [field=" '+ fieldName+' "]');
// 根据是否可编辑,添加或移除xEditable
materialColumnCells.each(function() {
var cell = $(this);
var currentValue = cell.text().trim(); // 获取当前单元格的值
if (isEditable) {
// 如果允许编辑且尚未添加xEditable
if (!cell.hasClass('editable')) {
cell.addClass('editable'); // 添加标记类,以便跟踪状态
cell.editable({
type: 'text',
pk: cell.closest('tr').data('id'), // 假设每行有唯一ID
title: '物料的数量',
validate: function(value) {
if (!value) return '金额不能为空';
if (isNaN(value)) return '金额必须为数字';
return true;
},
success: function(response, newValue) {
// 成功后的回调,这里可以根据需要处理服务器响应
}
});
}
} else {
// 如果不允许编辑且已添加了xEditable
if (cell.hasClass('editable')) {
cell.removeClass('editable');
// 这里简化处理,实际中可能需要更复杂的逻辑来销毁xEditable实例
cell.off('.editable'); // 移除xEditable绑定的事件
cell.text(currentValue); // 还原原始文本
}
}
});
});
// 初始化时触发一次,根据默认状态设置可编辑性
$("#commonCurrency_add").trigger("change");
});
function submitHandler() {
if ($.validate.form()) {
$.operate.save(prefix + "/add", $('#form-salesEstimate-add').serialize());
var formData = $("#form-salesEstimate-add").serializeArray();
var tableData = $("#bootstrap-sub-table-estimateChild").bootstrapTable('getData');
console.log("tableData", JSON.stringify(tableData));
var rows = tableData.length;
if (rows == 0) {
$.modal.alertWarning("子表数据不能为空!");
} else {
formData.push({"name": "sysSalesEstimateChildList", "value": tableData});
var jsonData = $.common.formDataToJson(formData);
$.operate.saveJson(prefix + "/add", jsonData);
}
}
}
@ -168,6 +612,7 @@
minView: "month",
autoclose: true
});
</script>
</body>
</html>

572
ruoyi-admin/src/main/resources/templates/sales/salesEstimate/edit.html

@ -70,97 +70,545 @@
<input name="estimateCurrencies" th:field="*{estimateCurrencies}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">不含税总价:</label>
<div class="col-sm-8">
<input name="allPriceExcludingTaxRmb" th:field="*{allPriceExcludingTaxRmb}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">含税总价:</label>
<div class="col-sm-8">
<input name="allPriceIncludesTax" th:field="*{allPriceIncludesTax}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">不含税总价:</label>
<div class="col-sm-8">
<input name="allPriceExcludingTaxDollar" th:field="*{allPriceExcludingTaxDollar}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">流程实例ID:</label>
<div class="col-sm-8">
<input name="instanceId" th:field="*{instanceId}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">流程实例类型:</label>
<div class="col-sm-8">
<select name="instanceType" class="form-control m-b">
<option value="">所有</option>
</select>
<span class="help-block m-b-none"><i class="fa fa-info-circle"></i> 代码生成请选择字典属性</span>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">流程提交实例ID:</label>
<div class="form-group">
<label class="col-sm-4 control-label">美元汇率:</label>
<div class="col-sm-8">
<input name="submitInstanceId" th:field="*{submitInstanceId}" class="form-control" type="text">
<input name="usdTax" id="usdTax_add" class="form-control" type="number" placeholder="美元对人民币汇率">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">申请标题</label>
<div class="form-group">
<label class="col-sm-4 control-label">国内税率:</label>
<div class="col-sm-8">
<input name="applyTitle" th:field="*{applyTitle}" class="form-control" type="text">
<div class="input-group">
<input name="rmbTax" id="rmbTax_add" class="form-control" type="number" placeholder="13" />
<span class="input-group-addon">%</span>
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">申请时间</label>
<div class="form-group">
<label class="col-sm-4 control-label">订价日期:</label>
<div class="col-sm-8">
<div class="input-group date">
<input name="applyTime" th:value="${#dates.format(salesEstimate.applyTime, 'yyyy-MM-dd')}" class="form-control" placeholder="yyyy-MM-dd" type="text">
<input name="pricingDate" th:field="*{pricingDate}" 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 class="form-group">
<label class="col-sm-3 control-label">申请人</label>
<div class="form-group">
<label class="col-sm-4 control-label">备注说明:</label>
<div class="col-sm-8">
<input name="applyUser" th:field="*{applyUser}" class="form-control" type="text">
<textarea th:field="*{remark}" name="remark" class="form-control" readonly></textarea>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">流程作废实例ID:</label>
<div class="col-sm-8">
<input name="cancelInstanceId" th:field="*{cancelInstanceId}" class="form-control" type="text">
<div class="container">
<h4 class="form-header h4">计算</h4>
<div class="row">
<div class="col-md-5">
<label class="col-sm-4">物料合计:</label>
<input class="col-sm-2" name="materialSum" id="materialSum_edit" type="text" readonly hidden="hidden"/>
<span></span>
</div>
<div class="col-md-5">
<label class="col-sm-4">数量合计:</label>
<input class="col-sm-2" name="quantitySum" id="quantitySum_edit" type="number" hidden="hidden" readonly/>
<span></span>
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">流程恢复实例ID:</label>
<div class="col-sm-8">
<input name="restoreInstanceId" th:field="*{restoreInstanceId}" class="form-control" type="text">
<div class="row">
<div class="col-xs-3">
<label class="col-sm-8">不含税单价:</label>
<input class="col-sm-1" name="noRmbPrice" id="noRmb_edit" hidden="hidden" type="number" readonly/>
<span></span>RMB
</div>
<div class="col-xs-3">
<label class="col-sm-8">含税单价:</label>
<input class="col-sm-1" name="rmbPrice" id="rmb_edit" hidden="hidden" type="number" readonly/>
<span></span>RMB
</div>
<div class="col-xs-3">
<label class="col-sm-8">不含税总价:</label>
<input class="col-sm-1" name="noRmbSumPrice" id="noRmbSum_edit" hidden="hidden" type="number" readonly/>
<span></span>RMB
</div>
<div class="col-xs-3">
<label class="col-sm-8">含税总价:</label>
<input class="col-sm-1" name="rmbTaxSum" id="rmbTaxSum_edit" hidden="hidden" type="number" readonly/>
<span></span>RMB
</div>
</div>
</div>
<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 class="row">
<div class="col-xs-3">
<label class="col-sm-8">不含税单价:</label>
<input class="col-sm-2" name="noUsdPrice" id="noUsd_edit" hidden="hidden" type="number" readonly/>
<span></span>美元
</div>
<div class="col-xs-3">
<label class="col-sm-8">含税单价:</label>
<input class="col-sm-2" name="usdPrice" id="usd_edit" hidden="hidden" type="number" readonly/>
<span></span>美元
</div>
<div class="col-xs-3">
<label class="col-sm-8">不含税总价:</label>
<input class="col-sm-2" name="noUsdSum" id="noUsdSum_edit" hidden="hidden" type="number" readonly/>
<span></span>美元
</div>
<div class="col-xs-3">
<label class="col-sm-8">含税总价:</label>
<input class="col-sm-2" name="usdTaxSum" id="usdSum_edit" hidden="hidden" type="number" readonly/>
<span></span>美元
</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 + "sales/salesEstimate";
$("#form-salesEstimate-edit").validate({
focusCleanup: true
$("#form-salesEstimate-edit").validate({focusCleanup: true});
$(function(){
$("select[name='customerCode']").select2({
theme: "bootstrap",
allowClear: true,
placeholder: "请选择客户",
ajax:{
type: "post",
url:ctx + "system/customer/customerList",
dataType:"json",
delay:250,
cache:true,
processResults: function (res, params) {
var resultList = res.rows;
console.log("传输的数值");
console.log(resultList);
var options = [];
for(var i= 0, len=resultList.length;i<len;i++){
var option = resultList[i];
option.id = resultList[i]["enterpriseCode"];
option.text = resultList[i]["enterpriseCode"];
options.push(option);
}
return {
results: options,
pagination: {
}
};
},
escapeMarkup: function (markup) { return markup; },
// minimumInputLength: 1
}
});
})
$('#customerCode').on('select2:select', function (e) {
var data = e.params.data;
$("input[name='customerName']").val(data.enterpriseName);
$("select[name='commonCurrency']").val(data.commonCurrency).trigger('change');
$("input[name='rmbTax']").val(data.taxRate);
$("#commonCurrency_add").val(data.commonCurrency).trigger('change');
commonCurrency = $("#commonCurrency_add option:selected").val();
});
$(function() {
var options = {
id:'bootstrap-sub-table-estimateChild',
// url: ctx + "system/estimateChild/list",
pagination: false,
sidePagination: "client",
model: "物料报价信息",
columns: [
{checkbox: true},
{field: 'index',align: 'center', title: "序号",
formatter: function (value, row, index) {
var columnIndex = $.common.sprintf("<input type='hidden' name='index' value='%s'>", $.table.serialNumber(index));
return columnIndex + $.table.serialNumber(index);
}
},
{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) {
if(value == null || value == ""){
value = "";
return "<img src='' herf='' />";
}
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',
editable: {
type: 'number',
mode: 'inline',
title: '对外售价',
validate: function (value) {
if (!value) {
return '对外售价不能为空';
}
if (isNaN(value)) {
return '对外售价必须为数字';
}
}
}
},
{title: '国内税率',field: 'countTax',align: 'center',},
{ title: '美元汇率',field: 'usdTax', align: 'center',},
{field: 'materialNum',align: 'center',title: '物料的数量',
editable:{
type : 'text',
mode: 'inline',
title : '物料的数量',
validate : function(value) {
if (!value) {
return '用量不能为空';
}
if (isNaN(value)) {
return '用量必须为数字';
}
}
},
},
{ title: '物料的不含税单价(RMB)',
field: 'materialNoRmb',
align: 'center',
editable:{
type: 'text', // 使用'text'类型,因为我们需自定义验证小数
mode: 'inline',
enabled: function() {
return ($("#commonCurrency_add").val() === '1'); // 当货币类型为2时启用
},
title: '物料的不含税单价(RMB)',
validate: function(value) {
// 验证是否为空
if (!value) {
return '金额不能为空';
}
// 尝试转换为浮点数并检查是否成功
var num = parseFloat(value);
if (isNaN(num)) {
return '请输入有效的数字';
}
// 检查小数点后是否有超过两位的数字
var decimalPart = num.toString().split('.')[1]; // 获取小数部分
if (decimalPart && decimalPart.length > 2) {
return '请输入精确到小数点后两位的数字';
}
}
}
},
{title: '物料的不含税单价(美元)',
field: 'materialNoUsd',
align: 'center',
editable: {
type: 'text', // 使用'text'类型,因为我们需自定义验证小数
mode: 'inline',
enabled: function() {
return ($("#commonCurrency_add").val() === '2'); // 当货币类型为2时启用
},
title: '物料的不含税单价(美元)',
validate: function(value) {
// 验证是否为空
if (!value) {
return '金额不能为空';
}
// 尝试转换为浮点数并检查是否成功
var num = parseFloat(value);
if (isNaN(num)) {
return '请输入有效的数字';
}
// 检查小数点后是否有超过两位的数字
var decimalPart = num.toString().split('.')[1]; // 获取小数部分
if (decimalPart && decimalPart.length > 2) {
return '请输入精确到小数点后两位的数字';
}
}
}
},
{ title: '物料的含税单价(美元)',field: 'materialUsd',align: 'center',},
{ title: '物料的含税总价(美元)',field: 'materialUsdSum', align: 'center',},
{ title: '物料的不含税总价(美元)',field: 'materialNoUsdSum',align: 'center',},
{ title: '物料的含税总价(RMB)',field: 'materialNoRmbSum',align: 'center',},
{title: '物料的不含税总价(RMB)',field: 'materialRmbSum',align: 'center',},
{field: 'createBy', align: 'center',title: '录入人',visible: false},
{field: 'createTime',align: 'center',title: '录入时间',visible: false},
{field: 'updateBy',align: 'center',title: '更新人',visible: false},
{field: 'updateTime',align: 'center',title: '上次更新时间',visible: false},
{field: 'remark',align: 'center',title: '备注',visible: false},
{field: 'auditStatus',align: 'center',title: '审核状态',visible: false,
formatter: function(value, row, index) {return $.table.selectDictLabel(auditStatusDatas, value);}
},
{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.id + '\')"><i class="fa fa-remove"></i>删除</a> ');
return actions.join('');
}
}
],
onEditableSave:function(field, row, oldValue, $el){
var commonCurrency1 = $("#commonCurrency_add option:selected").val();
var rmb1 = $("#rmbTax_add").val();
if (rmb1 =='' || rmb1== null){
rmb1 = 0;
}else{
rmb1 = $("#rmbTax_add").val();
}
var rmb = parseFloat(rmb1);
var usd = $("#usdTax_add").val();
if (usd =='' || usd== null){
usd = 0;
}else{
usd = parseFloat(usd);
}
console.log(commonCurrency1);
if(commonCurrency1 == 1){
row.materialNoRmb = parseFloat(row.materialNoRmb).toFixed(2);
row.materialRmb = parseFloat(row.materialNoRmb * parseFloat(1 + rmb)).toFixed(2);
row.materialNoRmbSum = parseFloat(row.materialNum * parseFloat(row.materialNoRmb)).toFixed(2);
row.materialRmbSum = parseFloat(row.materialRmb * row.materialNum).toFixed(2);
row.materialNoUsd = parseFloat(row.materialNoRmb / usd).toFixed(2);
row.materialNoUsdSum = parseFloat(row.materialNum * row.materialNoUsd).toFixed(2);
row.materialUsd = parseFloat(row.materialNoUsd).toFixed(2);
row.materialUsdSum = parseFloat(row.materialNum * row.materialUsd).toFixed(2);
}
else if( commonCurrency1 == 2){
row.materialNoUsd = parseFloat(row.materialNoUsd).toFixed(2);
row.materialUsd = parseFloat(row.materialNoUsd).toFixed(2);
row.materialUsdSum = parseFloat(row.materialNum * row.materialUsd).toFixed(2);
row.materialNoUsdSum = parseFloat(row.materialNoUsd * row.materialNum).toFixed(2);
row.materialNoRmb = parseFloat(row.materialNoUsd * usd).toFixed(2);
row.materialRmb = parseFloat(row.materialNoRmb * (1 + rmb)).toFixed(2);
row.materialNoRmbSum = parseFloat(row.materialNoRmb * row.materialNum).toFixed(2);
row.materialRmbSum = parseFloat(row.materialRmb * row.materialNum).toFixed(2);
}
getTotalAmount()
},
};
$.table.init(options);
});
//获取单号
$.ajax({
url: prefix + "/getId",
type: "post",
dateType: "json",
success: function (resp) {
if (resp.code === 0) {
$("input[name='aftersalesEstimateCode']").val(resp.data);
} else {
$.modal.msgError("失败啦");
}
},
error: function () {
$.modal.msgError("后台出错啦!");
}
});
/*业务员列表*/
$.ajax({
url: ctx + 'system/salesOrder/getBinessMembers',
type: 'get',
success: function (res) {
console.log(res)
if (res.rows.length > 0) {
var usertData = res.rows;
for (let i in usertData) {
$("#form-salesEstimate-add select[name='businessMembers']").append(
"<option value='" + usertData[i].userName + "'>" + usertData[i].userName + "</option>");
}
$("#form-salesEstimate-add select[name='businessMembers']").val(userName).trigger("change");
} else {
$.modal.msgError(res.msg);
}
}
});
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-estimateChild").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,
countTax: '',
usdTax: '',
materialNum: "",
materialSole: "",
materialRmb: "",
materialNoRmb: "",
materialNoUsd: "",
materialUsd: "",
materialUsdSum: "",
materialNoUsdSum: "",
materialNoRmbSum: "",
materialRmbSum: "",
createBy: "",
createTime: "",
updateBy: "",
updateTime: "",
remark: "",
}
})
}
function insertRow() {
if ($("#customerCode").val() == null || $("#customerCode").val() == '') {
$.modal.alertWarning("请先选择客户");
return;
}
if ($("#rmbTax_add").val() == null || $("#rmbTax_add").val() == '') {
$.modal.alertWarning("请先选择输入国内的税率");
return;
}
var url = ctx + "erp/material/select";
var options = {
title: '选择料号',
url: url,
callBack: doSubmit
};
$.modal.openOptions(options);
}
/* 删除指定表格行 */
function removeRow(id){
$("#bootstrap-sub-table-estimateChild").bootstrapTable('remove', {
field: 'id',
values: id
})
}
$("input[name='pricingDate']").datetimepicker({
format: "yyyy-mm-dd",
minView: "month",
autoclose: true
});
//计算金额
function getTotalAmount() {
// 获取表格数据
const data = $("#bootstrap-sub-table-estimateChild").bootstrapTable('getData', true);
// 初始化汇总对象,减少代码重复并提高清晰度
const sums = {
enterprise: "", // 用于拼接物料名称和数量
enterpriseSum: 0, // 物料总数量
currencies: {
noRmb: { total: 0, single: 0 }, // 非人民币数量与总金额
rmb: { total: 0, single: 0 }, // 人民币
noUsd: { total: 0, single: 0 }, // 非美元
usd: { total: 0, single: 0 } // 美元
}
};
// 遍历数据进行计算
for (let i = 0; i < data.length; i++) {
const item = data[i];
// 拼接物料信息
sums.enterprise += "" + item.materialName + ": 数量 : " + item.materialNum;
sums.enterpriseSum += parseFloat(item.materialNum); // 累加物料数量
// 分别累加各货币的单个金额和总金额
['noRmb', 'rmb', 'noUsd', 'usd'].forEach(currency => {
sums.currencies[currency].single += parseFloat(item['material' + [currency] ]);
sums.currencies[currency].total += parseFloat(item['material' + [currency] + 'Sum']);
});
}
updateFormValues(sums);
}
function updateFormValues(sums) {
// 物料合计与数量合计没有在sums中直接给出,这里假设它们需要单独处理或已存在于页面其他部分
$("#enterprise_edit").val(sums.enterprise);
$("#enterpriseSum_edit").val(sums.enterpriseSum);
// 更新不含税单价和总价
$("#noRmb_edit").val(sums.currencies.noRmb.single);
$("#noRmbSum_edit").val(sums.currencies.noRmb.total);
$("#rmb_edit").val(sums.currencies.rmb.single);
$("#rmbSum_edit").val(sums.currencies.rmb.total);
$("#noUsd_edit").val(sums.currencies.noUsd.single);
$("#noUsdSum_edit").val(sums.currencies.noUsd.total);
$("#usd_edit").val(sums.currencies.usd.single);
$("#usdSum_edit").val(sums.currencies.usd.total);
}
$(document).ready(function() {
// 监听货币选项变化
$("#commonCurrency_edit").on("change", function() {
var isEditable = $(this).val() === "1";
var fieldName = "";
var materialColumnCells = $('#bootstrap-sub-table-estimateChild tbody tr td [field=" '+ fieldName+' "]');
// 根据是否可编辑,添加或移除xEditable
materialColumnCells.each(function() {
var cell = $(this);
var currentValue = cell.text().trim(); // 获取当前单元格的值
if (isEditable) {
// 如果允许编辑且尚未添加xEditable
if (!cell.hasClass('editable')) {
cell.addClass('editable'); // 添加标记类,以便跟踪状态
cell.editable({
type: 'text',
pk: cell.closest('tr').data('id'), // 假设每行有唯一ID
title: '物料的数量',
validate: function(value) {
if (!value) return '金额不能为空';
if (isNaN(value)) return '金额必须为数字';
return true;
},
success: function(response, newValue) {
// 成功后的回调,这里可以根据需要处理服务器响应
}
});
}
} else {
// 如果不允许编辑且已添加了xEditable
if (cell.hasClass('editable')) {
cell.removeClass('editable');
// 这里简化处理,实际中可能需要更复杂的逻辑来销毁xEditable实例
cell.off('.editable'); // 移除xEditable绑定的事件
cell.text(currentValue); // 还原原始文本
}
}
});
});
// 初始化时触发一次,根据默认状态设置可编辑性
$("#commonCurrency_edit").trigger("change");
});
function submitHandler() {
if ($.validate.form()) {
$.operate.save(prefix + "/edit", $('#form-salesEstimate-edit').serialize());
var formData = $("#form-salesEstimate-edit").serializeArray();
var tableData = $("#bootstrap-sub-table-estimateChild").bootstrapTable('getData');
console.log("tableData", JSON.stringify(tableData));
var rows = tableData.length;
if (rows == 0) {
$.modal.alertWarning("子表数据不能为空!");
} else {
formData.push({"name": "sysSalesEstimateChildList", "value": tableData});
var jsonData = $.common.formDataToJson(formData);
$.operate.saveJson(prefix + "/add", jsonData);
}
}
}

113
ruoyi-admin/src/main/resources/templates/sales/salesEstimate/salesEstimate.html

@ -79,7 +79,6 @@
var restoreFlag = [[${@permission.hasPermi('sales:salesEstimate:restore')}]];
var estimateStatusDatas = [[${@dict.getType('estimate_status')}]];
var prefix = ctx + "sales/salesEstimate";
$(function() {
var options = {
url: prefix + "/list",
@ -90,88 +89,40 @@
restoreUrl: prefix + "/restore/{id}",
exportUrl: prefix + "/export",
modalName: "销售估价",
columns: [{
checkbox: true
},
{
title: '销售估价ID',
field: 'aftersalesEstimateId',
visible: false
},
{
title: '估价单号',
field: 'aftersalesEstimateCode',
},
{
title: '估价状态',
field: 'estimateStatus',
formatter: function(value, row, index) {
return $.table.selectDictLabel(estimateStatusDatas, value);
}
},
{
title: '客户代码',
field: 'enterpriseCode',
},
{
title: '客户名称',
field: 'enterpriseName',
},
{
title: '料号',
field: 'materialNo',
},
{
title: '物料名称',
field: 'materialName',
},
{
title: '物料合计',
field: 'materialSum',
},
{
title: '数量合计',
field: 'quantitySum',
},
{
title: '估价币种',
field: 'estimateCurrencies',
},
{
title: '不含税总价',
field: 'allPriceExcludingTaxRmb',
},
{
title: '含税总价',
field: 'allPriceIncludesTax',
},
{
title: '不含税总价',
field: 'allPriceExcludingTaxDollar',
},
{
title: '录入时间',
field: 'createTime',
},
{
title: '更新人',
field: 'updateBy',
},
{
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.aftersalesEstimateId + '\')"><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.aftersalesEstimateId + '\')"><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> ');
columns: [
{checkbox: true},
{title: '销售估价ID',field: 'aftersalesEstimateId',visible: false},
{title: '估价单号',field: 'aftersalesEstimateCode',},
{title: '估价状态',field: 'estimateStatus',
formatter: function(value, row, index) {return $.table.selectDictLabel(estimateStatusDatas, value);}
},
{title: '客户代码',field: 'enterpriseCode',},
{title: '客户名称',field: 'enterpriseName',},
{title: '料号',field: 'materialNo',},
{title: '物料名称',field: 'materialName',},
{title: '物料合计',field: 'materialSum',},
{title: '数量合计',field: 'quantitySum',},
{title: '估价币种',field: 'estimateCurrencies',},
{title: '不含税总价(RMB)',field: 'allPriceExcludingNoTaxRmb',},
{title: '含税总价(RMB)',field: 'allPriceIncludesTaxRmb',},
{title: '不含税总价(美元)',field: 'allPriceExcludingNoTaxDollar',},
{title: '含税总价(美元)',field: 'allPriceExcludingTaxDollar',},
{title: '录入时间',field: 'createTime',},
{title: '更新人',field: 'updateBy',},
{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.aftersalesEstimateId + '\')"><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.aftersalesEstimateId + '\')"><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> ');
}
return actions.join('');
}
return actions.join('');
}
}]
]
};
$.table.init(options);
});

Loading…
Cancel
Save