更新各项功能
This commit is contained in:
@@ -300,8 +300,12 @@ func (c *BackendCrmContractController) Create() {
|
||||
return
|
||||
}
|
||||
row.Products = products
|
||||
// 合同产品清单同步到产品管理(新增产品自动建档、成本单价取产品管理)
|
||||
if synced, serr := SyncContractProducts(tenantID, pipelineUID(claims), json.RawMessage(products)); serr == nil {
|
||||
// 合同产品清单同步到产品管理(新增产品自动建档、成本单价取产品管理;含软件开发行)
|
||||
projID := uint64(0)
|
||||
if row.ProjectID != nil {
|
||||
projID = *row.ProjectID
|
||||
}
|
||||
if synced, serr := SyncContractProducts(tenantID, pipelineUID(claims), projID, row.ProjectName, json.RawMessage(products)); serr == nil {
|
||||
row.Products = string(synced)
|
||||
}
|
||||
applyContractAmounts(&row)
|
||||
@@ -397,15 +401,18 @@ func (c *BackendCrmContractController) Update() {
|
||||
return
|
||||
}
|
||||
row.Products = products
|
||||
// 合同产品清单同步到产品管理(新增产品自动建档、成本单价取产品管理)
|
||||
if synced, serr := SyncContractProducts(tenantID, pipelineUID(claims), json.RawMessage(products)); serr == nil {
|
||||
// 合同产品清单同步到产品管理(新增产品自动建档、成本单价取产品管理;含软件开发行)
|
||||
projID := uint64(0)
|
||||
if row.ProjectID != nil {
|
||||
projID = *row.ProjectID
|
||||
}
|
||||
if synced, serr := SyncContractProducts(tenantID, pipelineUID(claims), projID, row.ProjectName, json.RawMessage(products)); serr == nil {
|
||||
row.Products = string(synced)
|
||||
}
|
||||
}
|
||||
applyContractAmounts(&row)
|
||||
if p.Status != 0 {
|
||||
row.Status = p.Status
|
||||
}
|
||||
// 状态不随合同编辑变更(避免编辑保存把已流转的状态打回草稿);
|
||||
// 签订/履约/作废等流转统一由「状态流转」接口 ChangeStatus 控制。
|
||||
if p.Step != 0 {
|
||||
row.Step = p.Step
|
||||
}
|
||||
@@ -606,12 +613,30 @@ func applyContractAmounts(row *models.TenantCrmContract) {
|
||||
}
|
||||
var hardware, software, other, cost float64
|
||||
for _, item := range items {
|
||||
// 软件开发行:金额来自模块树汇总(统一人天单价×人天,不计税率/成本,与前端 buildSummary 一致)
|
||||
// 软件开发行:开发总成本由模块报价带出(默认 = 人天×统一人天单价,可手工改写),计入产品成本;
|
||||
// 对外金额取销售单价(缺省时回退开发总成本 / 人天汇总,兼容历史数据);不计税率。
|
||||
// 口径与前端 utils.js 的 lineAmount / lineCost / buildSummary 保持一致。
|
||||
if fmt.Sprintf("%v", item["line_type"]) == "dev" {
|
||||
if tree, ok := item["dev_tree"].([]interface{}); ok {
|
||||
unitPrice := toFloat64(item["dev_unit_price"])
|
||||
software = round2(software + contractTreeSellTotal(tree, unitPrice))
|
||||
qty := toFloat64(item["quantity"])
|
||||
if qty <= 0 {
|
||||
qty = 1
|
||||
}
|
||||
total := toFloat64(item["dev_total_price"])
|
||||
if total <= 0 {
|
||||
if tree, ok := item["dev_tree"].([]interface{}); ok {
|
||||
total = contractTreeSellTotal(tree, toFloat64(item["dev_unit_price"]))
|
||||
}
|
||||
}
|
||||
costPrice := toFloat64(item["cost_price"])
|
||||
if costPrice <= 0 {
|
||||
costPrice = total
|
||||
}
|
||||
price := toFloat64(item["price"])
|
||||
if price <= 0 {
|
||||
price = total
|
||||
}
|
||||
software = round2(software + round2(qty*price))
|
||||
cost = round2(cost + round2(qty*costPrice))
|
||||
continue
|
||||
}
|
||||
qty := toFloat64(item["quantity"])
|
||||
|
||||
Reference in New Issue
Block a user