123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683 |
- package bid
- import (
- "zhiyuan/models"
- "zhiyuan/pkg/app"
- "zhiyuan/pkg/db"
- "zhiyuan/pkg/param/material"
- bidParam "zhiyuan/pkg/param/material/bid"
- "zhiyuan/pkg/utils"
- "zhiyuan/services/form"
- "zhiyuan/services/structs"
- "zhiyuan/services/structs/calc"
- "zhiyuan/services/user"
- )
- var MatBidOrder models.MatBidOrder
- func GetOrders(where map[string]interface{}, fields []string, page app.Page, retVal interface{}) ([]*models.MatBidOrder, error) {
- if page.PageNum > 0 && page.PageSize > 0 {
- where["_limit"] = db.GetOffset(uint(page.PageNum), uint(page.PageSize))
- }
- return MatBidOrder.GetMulti(where, fields, retVal)
- }
- func CountOrder(where map[string]interface{}) (int64, error) {
- return db.Count(MatBidOrder.TableName(), where)
- }
- func GetOrder(where map[string]interface{}, fields []string, dest interface{}) (*models.MatBidOrder, error) {
- return MatBidOrder.GetOne(where, fields, dest)
- }
- func CountRaw(where string, param map[string]interface{}) (int64, error) {
- query := "`zy_mat_bid_order` left join `zy_admin` on `zy_admin`.`id` = `zy_mat_bid_order`.`admin_id` WHERE " + where
- return db.CountRaw(query, param)
- }
- func GetOrdersRaw(where map[string]string, param map[string]interface{}, retVal interface{}) error {
- field := "SELECT `zy_mat_bid_order`.*, `zy_admin`.`username` as `admin_name` FROM `zy_mat_bid_order` left join `zy_admin` on `zy_admin`.`id` = `zy_mat_bid_order`.`admin_id` "
- return db.GetMultiRaw(field, where, param, retVal)
- }
- func OutputPriceDetail(id int) error {
- var orderInfo *structs.MaterialBidOrderList
- if _, err := GetOrder(map[string]interface{}{"id": id}, nil, &orderInfo); err != nil {
- return err
- }
- bidList := make([]*structs.MaterialBidList, 0)
- if _, err := GetBidList(map[string]interface{}{"pkg_id": orderInfo.PkgID}, nil, app.Page{}, &bidList); err != nil {
- return err
- }
- bidListMap := make(map[int][]*structs.MaterialBidList)
- bidMap := make(map[int]*structs.MaterialBidList)
- for _, v := range material.Params.RoomType {
- bidListMap[v.ID] = make([]*structs.MaterialBidList, 0)
- }
- for _, v := range bidList {
- bidMap[v.ID] = v
- }
- return nil
- }
- func GetTransportRate(baseRate float64, isElevator int, floorNum int) float64 {
- if isElevator == 0 && floorNum > 2 {
- baseRate = utils.FloatAdd(baseRate, utils.FloatMul(float64(floorNum-2), 0.005, -1), 4)
- }
- return baseRate
- }
- func CalcToilet(form1 form.MaterialBidDetailCalc1) (calc.PriceReturn, error) {
- var pkg models.MatPkg
- pkgInfo, _ := pkg.GetOne(map[string]interface{}{"id": form1.PkgID}, nil, nil)
- bidList := make([]*structs.MaterialBidList, 0)
- if _, err := GetBidList(map[string]interface{}{"pkg_id": form1.PkgID}, nil, app.Page{}, &bidList); err != nil {
- return calc.PriceReturn{}, err
- }
- bidListMap := make(map[int][]*structs.MaterialBidList)
- bidMap := make(map[int]*structs.MaterialBidList)
- for _, v := range material.Params.RoomType {
- bidListMap[v.ID] = make([]*structs.MaterialBidList, 0)
- }
- for _, v := range bidList {
- if v.CalcParam != "" {
- utils.JsonDecode(v.CalcParam).To(&v.CalcParamDecode)
- }
- bidMap[v.ID] = v
- bidListMap[v.RoomType] = append(bidListMap[v.RoomType], v)
- }
- transportRate := GetTransportRate(pkgInfo.TransportRate, 0, 0)
- // 套餐内
- var packagePrice calc.PackagePrice
- calcSetting := structs.MaterialBidCalcSetting{RoomNum: 0, ToiletNum: 1, RestaurantNum: 0, KitchenNum: 0}
- param := []structs.MaterialBidOrderParam{{RoomType: 4, RoomName: "卫生间", Area: form1.Area, Round: form1.Round, Hole: 0, Window: 0}}
- for _, v := range param {
- if v.RoomType == 4 {
- holeArea := utils.FloatMul(v.Hole, 2, -1)
- wallArea := utils.FloatMul(v.Round, 2.4, -1)
- calcSetting.ToiletWallArea = wallArea - holeArea
- }
- }
- var inclusivePrice calc.InclusivePrice
- var inclusiveCost calc.InclusiveCost
- formCalc := form.MaterialBidDetailCalc{}
- for k, v := range param {
- bidItems := bidListMap[0]
- //fmt.Println(v.RoomName+ " 面积:"+utils.ToStr(v.Area)+ " 周长:"+utils.ToStr(v.Round)+ " 门洞:"+utils.ToStr(v.Hole)+ " 窗宽:"+utils.ToStr(v.Window))
- //fmt.Println("====================================================")
- v.Items = make([]structs.MaterialBidOrderItem, 0)
- for _, bidItem := range bidItems {
- price := CalcBidItemMoney(v, bidItem, calcSetting, formCalc)
- if bidItem.Category == 30 || bidItem.Category == 31 {
- switch bidItem.Category {
- case 30:
- //fmt.Println("施工—-"+bidItem.BidName+":"+utils.ToStr(price))
- packagePrice.BuildPrice.Direct = utils.FloatAdd(packagePrice.BuildPrice.Direct, price, 4)
- case 31:
- //fmt.Println("主材—-"+bidItem.BidName+":"+utils.ToStr(price))
- packagePrice.Material = utils.FloatAdd(packagePrice.Material, price, 4)
- }
- v.Items = append(v.Items, structs.MaterialBidOrderItem{
- Price: price,
- ID: bidItem.ID,
- BidName: bidItem.BidName,
- })
- }
- }
- param[k] = v
- //fmt.Println("")
- }
- //packagePrice.BuildPrice.Transport = utils.FloatMul(packagePrice.BuildPrice.Direct, transportRate, 4)
- //packagePrice.BuildPrice.Manage = utils.FloatMul(utils.FloatAddSlice([]float64{packagePrice.BuildPrice.Direct, packagePrice.BuildPrice.Sanitation, packagePrice.BuildPrice.Transport}, -1), pkgInfo.ManageRate, 4)
- //packagePrice.BuildPrice.CementExtra = utils.FloatMul(houseParam.Area, 10, -1)
- //packagePrice.BuildPrice.Design = utils.FloatMul(houseParam.Area, pkgInfo.DesignFee, 4)
- packagePrice.BuildPrice.Total = packagePrice.BuildPrice.Direct
- packagePrice.BuildPrice.TotalCost = utils.FloatMul(pkgInfo.PackageRate, packagePrice.BuildPrice.Total, 4)
- packagePrice.BuildPrice.TotalCost = utils.FloatMul(1.15, packagePrice.BuildPrice.TotalCost, 4)
- // 套餐补贴成本
- //packagePrice.CostExtra = CalcPackageCostExtra(calcSetting)
- packagePrice.CostExtra = 0
- // 完工补贴
- packagePrice.FinishExtra = 0
- // 套餐总报价
- packagePrice.Cost = utils.FloatAddSlice([]float64{packagePrice.BuildPrice.TotalCost, packagePrice.Material, packagePrice.CostExtra, packagePrice.FinishExtra}, -1)
- packagePrice.Total = utils.FloatDiv(packagePrice.Cost, utils.FloatSub(1, pkgInfo.ToiletRate, -1), -1)
- //packagePrice.Total = utils.FloatDiv(packagePrice.Total, pkgInfo.DiscountRate, 4)
- //fmt.Println("定制品总金额:"+ utils.ToStr(inclusivePrice.Total))
- //fmt.Println("------------")
- money := utils.FloatAddSlice([]float64{packagePrice.Total, 0, inclusivePrice.Total}, 0)
- //fmt.Println("总报价:"+ utils.ToStr(money))
- //fmt.Println("------------")
- /*baseDiscount := utils.FloatDiv(utils.FloatSub(utils.FloatAdd(packagePrice.Total, inclusivePrice.Total, -1), inclusiveCost.Total, -1), packagePrice.Total, -1)
- if baseDiscount < pkgInfo.MinDiscount {
- total := utils.FloatSub(inclusiveCost.Total, utils.FloatMul(utils.FloatSub(1, pkgInfo.MinDiscount, -1), packagePrice.Total, -1), -1)
- inclusivePrice.Discount = utils.FloatSub(total, inclusivePrice.Total, -1)
- inclusivePrice.Total = total
- baseDiscount = pkgInfo.MinDiscount
- money = utils.FloatAddSlice([]float64{packagePrice.Total, 0, inclusivePrice.Total}, 0)
- }
- baseInterestRate := utils.FloatSub(1, utils.FloatDiv(packagePrice.Cost, utils.FloatSub(utils.FloatAdd(packagePrice.Total, inclusivePrice.Total, -1), inclusiveCost.Total, -1), -1), -1)
- interestRate := utils.FloatSub(1, utils.FloatDiv(utils.FloatSub(utils.FloatAdd(packagePrice.Cost, 0, -1), 0, -1), utils.FloatSubSlice([]float64{utils.FloatAddSlice([]float64{packagePrice.Total, inclusivePrice.Total, 0}, -1), inclusiveCost.Total, 0}, -1), -1), -1)*/
- return calc.PriceReturn{
- PackagePrice: packagePrice.Total,
- PackagePriceDetail: utils.JsonEncode(packagePrice),
- CustomizePrice: 0,
- CustomizePriceDetail: "",
- InclusivePrice: inclusivePrice.Total,
- InclusivePriceDetail: utils.JsonEncode(inclusivePrice),
- InclusiveCost: inclusiveCost.Total,
- InclusiveCostDetail: utils.JsonEncode(inclusiveCost),
- BaseDiscount: 0,
- BaseInterestRate: 0,
- InterestRate: 0,
- HouseArea: form1.Area,
- TotalPrice: money,
- Customize: "",
- Param: utils.JsonEncode(param),
- TransportRate: transportRate,
- IsElevator: 0,
- FloorNum: 0,
- }, nil
- }
- func Calc(form form.MaterialBidDetailCalc) (calc.PriceReturn, error) {
- var pkg models.MatPkg
- pkgInfo, _ := pkg.GetOne(map[string]interface{}{"id": form.PkgID}, nil, nil)
- if form.Type == 1 {
- var outline calc.Outline
- utils.JsonDecode(pkgInfo.Outline).To(&outline)
- var outlinePrice calc.OutlinePrice
- roomNum := float64(0) // 房间数量
- kitchenNum := float64(0) // 厨房数量
- toiletNum := float64(0) // 卫生间数量
- addRoomNum := float64(0) // 附加房间数量
- addKitchenNum := float64(0) // 附加厨房数量
- addToiletNum := float64(0) // 附加卫生间数量
- for _, v := range form.HouseStyle {
- if v.Type == 1 {
- roomNum = utils.ToFloat64(v.Num)
- } else if v.Type == 3 {
- kitchenNum = utils.ToFloat64(v.Num)
- } else if v.Type == 4 {
- toiletNum = utils.ToFloat64(v.Num)
- }
- }
- if roomNum > outline.RoomNum {
- addRoomNum = roomNum - outline.RoomNum
- }
- if kitchenNum > outline.KitchenNum {
- addKitchenNum = kitchenNum - outline.KitchenNum
- }
- if toiletNum > outline.ToiletNum {
- addToiletNum = toiletNum - outline.ToiletNum
- }
- outlinePrice.Area = utils.FloatMul(form.Area, outline.InsideScale, -1)
- outlinePrice.RoomPrice = utils.FloatMul(addRoomNum, outline.RoomPrice, -1)
- outlinePrice.KitchenPrice = utils.FloatMul(addKitchenNum, outline.KitchenPrice, -1)
- outlinePrice.ToiletPrice = utils.FloatMul(addToiletNum, outline.ToiletPrice, -1)
- areaMax := float64(0)
- areaPrice := float64(0)
- areaMin := float64(0)
- areaPriceMin := float64(0)
- for _, v := range outline.AreaPrice {
- if v.Area <= outlinePrice.Area && v.Area > areaMax {
- areaMax = v.Area
- areaPrice = v.Price
- }
- if areaMin == 0 || areaMin > v.Area {
- areaMin = v.Area
- areaPriceMin = v.Price
- }
- }
- if areaMax == 0 {
- outlinePrice.Area = areaMin
- areaPrice = areaPriceMin
- }
- //outlinePrice.AreaPrice = utils.FloatMul(outlinePrice.Area, areaPrice, -1)
- outlinePrice.AreaPrice = areaPrice
- outlinePrice.DiscountPrice = utils.FloatAddSlice([]float64{outlinePrice.AreaPrice, outlinePrice.RoomPrice, outlinePrice.KitchenPrice, outlinePrice.ToiletPrice}, -1)
- for _, v := range outline.ExtraItem {
- extraMoney := float64(0)
- switch v.Type {
- case 0:
- extraMoney = v.Price
- case 1:
- extraMoney = utils.FloatMul(outlinePrice.Area, v.Price, -1)
- case 2:
- extraMoney = utils.FloatMul(roomNum, v.Price, -1)
- case 3:
- extraMoney = utils.FloatMul(kitchenNum, v.Price, -1)
- case 4:
- extraMoney = utils.FloatMul(toiletNum, v.Price, -1)
- case 5:
- extraMoney = utils.FloatMul(addRoomNum, v.Price, -1)
- case 6:
- extraMoney = utils.FloatMul(addKitchenNum, v.Price, -1)
- case 7:
- extraMoney = utils.FloatMul(addToiletNum, v.Price, -1)
- }
- outlinePrice.ExtraItemPrice = append(outlinePrice.ExtraItemPrice, calc.ExtraItemPrice{
- Name: v.Name,
- Price: extraMoney,
- })
- outlinePrice.DiscountPrice = utils.FloatAdd(outlinePrice.DiscountPrice, extraMoney, -1)
- }
- outlinePrice.Total = utils.FloatDiv(outlinePrice.DiscountPrice, outline.DiscountScale, -1)
- /*compute1 := utils.FloatAddSlice([]float64{5218.1, utils.FloatMul(roomNum, 1570.3, -1), 9696.4, 5094.1, utils.FloatMul(5344.1, utils.FloatSub(toiletNum, 1, -1), -1)}, -1)
- compute2 := utils.FloatMul(utils.FloatSubSlice([]float64{Area, 5.4, utils.FloatMul(toiletNum, 3.6, -1)}, -1), 572, -1)
- compute3 := utils.FloatAdd(utils.FloatMul(5.4, 960.17, -1), utils.FloatMulSlice([]float64{toiletNum, 3.6, 960.17}, -1), -1)
- compute4 := utils.FloatAddSlice([]float64{compute1, compute2, compute3}, -1)
- compute5 := utils.FloatSub(compute4, utils.FloatMulSlice([]float64{Area, 0.4, 490}, -1), -1)
- compute5 = utils.FloatDiv(compute5, 0.546, -1)
- money := utils.FloatAdd(compute5, 69923, 0)*/
- return calc.PriceReturn{
- HouseArea: form.Area,
- PackagePrice: outlinePrice.DiscountPrice,
- PackagePriceDetail: utils.JsonEncode(outlinePrice),
- TotalPrice: outlinePrice.Total,
- OutlinePrice: outlinePrice,
- }, nil
- }
- bidList := make([]*structs.MaterialBidList, 0)
- if _, err := GetBidList(map[string]interface{}{"pkg_id": form.PkgID}, nil, app.Page{}, &bidList); err != nil {
- return calc.PriceReturn{}, err
- }
- bidListMap := make(map[int][]*structs.MaterialBidList)
- bidMap := make(map[int]*structs.MaterialBidList)
- for _, v := range material.Params.RoomType {
- bidListMap[v.ID] = make([]*structs.MaterialBidList, 0)
- }
- for _, v := range bidList {
- if v.CalcParam != "" {
- utils.JsonDecode(v.CalcParam).To(&v.CalcParamDecode)
- }
- bidMap[v.ID] = v
- bidListMap[v.RoomType] = append(bidListMap[v.RoomType], v)
- }
- transportRate := GetTransportRate(pkgInfo.TransportRate, form.IsElevator, form.FloorNum)
- // 套餐内
- var packagePrice calc.PackagePrice
- var toiletPrice calc.PackagePrice
- calcSetting := GetCalcSetting(form.HouseStyle)
- houseParam := structs.MaterialBidOrderParam{RoomType: 0, RoomName: "全房", Area: 0, Round: 0, Hole: 0, Window: 0}
- for _, v := range form.Param {
- if v.RoomType == 3 {
- calcSetting.KitchenHole = v.Hole
- holeArea := utils.FloatMul(v.Hole, 2, -1)
- wallArea := utils.FloatMul(v.Round, 2.4, -1)
- calcSetting.KitchenWallArea = wallArea - holeArea
- } else if v.RoomType == 4 {
- holeArea := utils.FloatMul(v.Hole, 2, -1)
- wallArea := utils.FloatMul(v.Round, 2.4, -1)
- calcSetting.ToiletWallArea = wallArea - holeArea
- } else if v.RoomType == 5 {
- calcSetting.BalconyArea = v.Area
- calcSetting.BalconyHole = v.Hole
- calcSetting.BalconyRound = v.Round
- calcSetting.BalconyWindow = v.Window
- }
- houseParam.Area = utils.FloatAdd(houseParam.Area, v.Area, 2)
- }
- if form.Area != 0 {
- houseParam.Area = form.Area
- }
- form.Param = append(form.Param, houseParam)
- var inclusivePrice calc.InclusivePrice
- var inclusiveCost calc.InclusiveCost
- for k, v := range form.Param {
- if v.RoomType == 4 && v.RoomName != "卫生间1" {
- bidItems := bidListMap[0]
- //fmt.Println(v.RoomName+ " 面积:"+utils.ToStr(v.Area)+ " 周长:"+utils.ToStr(v.Round)+ " 门洞:"+utils.ToStr(v.Hole)+ " 窗宽:"+utils.ToStr(v.Window))
- //fmt.Println("====================================================")
- v.Items = make([]structs.MaterialBidOrderItem, 0)
- for _, bidItem := range bidItems {
- price := CalcBidItemMoney(v, bidItem, calcSetting, form)
- if bidItem.Category == 30 || bidItem.Category == 31 {
- switch bidItem.Category {
- case 30:
- //fmt.Println("施工—-"+bidItem.BidName+":"+utils.ToStr(price))
- toiletPrice.BuildPrice.Direct = utils.FloatAdd(toiletPrice.BuildPrice.Direct, price, 4)
- case 31:
- //fmt.Println("主材—-"+bidItem.BidName+":"+utils.ToStr(price))
- toiletPrice.Material = utils.FloatAdd(toiletPrice.Material, price, 4)
- }
- v.Items = append(v.Items, structs.MaterialBidOrderItem{
- Price: price,
- ID: bidItem.ID,
- BidName: bidItem.BidName,
- })
- }
- }
- } else {
- bidItems := bidListMap[v.RoomType]
- //fmt.Println(v.RoomName+ " 面积:"+utils.ToStr(v.Area)+ " 周长:"+utils.ToStr(v.Round)+ " 门洞:"+utils.ToStr(v.Hole)+ " 窗宽:"+utils.ToStr(v.Window))
- //fmt.Println("====================================================")
- v.Items = make([]structs.MaterialBidOrderItem, 0)
- for _, bidItem := range bidItems {
- price := CalcBidItemMoney(v, bidItem, calcSetting, form)
- if bidItem.Level == 1 || bidItem.Level == 3 {
- switch bidItem.Category {
- case 1:
- packagePrice.BuildPrice.Direct = utils.FloatAdd(packagePrice.BuildPrice.Direct, price, 4)
- case 2:
- packagePrice.Material = utils.FloatAdd(packagePrice.Material, price, 4)
- case 12:
- inclusivePrice.Diy = utils.FloatAdd(inclusivePrice.Diy, price, 4)
- case 13:
- inclusivePrice.Furniture = utils.FloatAdd(inclusivePrice.Furniture, price, 4)
- case 14:
- inclusivePrice.Lamp = utils.FloatAdd(inclusivePrice.Lamp, price, 4)
- case 15:
- inclusivePrice.Curtain = utils.FloatAdd(inclusivePrice.Curtain, price, 4)
- case 21:
- inclusiveCost.Diy = utils.FloatAdd(inclusiveCost.Diy, price, 4)
- case 22:
- inclusiveCost.Furniture = utils.FloatAdd(inclusiveCost.Furniture, price, 4)
- case 23:
- inclusiveCost.Lamp = utils.FloatAdd(inclusiveCost.Lamp, price, 4)
- case 24:
- inclusiveCost.Curtain = utils.FloatAdd(inclusiveCost.Curtain, price, 4)
- case 25:
- inclusiveCost.Prize = utils.FloatAdd(inclusiveCost.Prize, price, 4)
- case 26:
- inclusiveCost.Deposit = utils.FloatAdd(inclusiveCost.Deposit, price, 4)
- case 27:
- inclusiveCost.Appliances = utils.FloatAdd(inclusiveCost.Appliances, price, 4)
- }
- v.Items = append(v.Items, structs.MaterialBidOrderItem{
- Price: price,
- ID: bidItem.ID,
- BidName: bidItem.BidName,
- })
- }
- }
- }
- form.Param[k] = v
- //fmt.Println("")
- }
- packagePrice.BuildPrice.Sanitation = utils.FloatMul(packagePrice.BuildPrice.Direct, transportRate, 4)
- packagePrice.BuildPrice.Transport = utils.FloatMul(packagePrice.BuildPrice.Direct, transportRate, 4)
- packagePrice.BuildPrice.Manage = utils.FloatMul(utils.FloatAddSlice([]float64{packagePrice.BuildPrice.Direct, packagePrice.BuildPrice.Sanitation, packagePrice.BuildPrice.Transport}, -1), pkgInfo.ManageRate, 4)
- packagePrice.BuildPrice.CementExtra = utils.FloatMul(houseParam.Area, 10, -1)
- packagePrice.BuildPrice.Design = utils.FloatMul(houseParam.Area, pkgInfo.DesignFee, 4)
- packagePrice.BuildPrice.Total = utils.FloatAddSlice([]float64{packagePrice.BuildPrice.Direct, packagePrice.BuildPrice.Manage, packagePrice.BuildPrice.Sanitation, packagePrice.BuildPrice.Transport, packagePrice.BuildPrice.Design, packagePrice.BuildPrice.CementExtra}, 4)
- packagePrice.BuildPrice.TotalCost = utils.FloatMul(pkgInfo.PackageRate, packagePrice.BuildPrice.Total, 4)
- // 套餐补贴成本
- //packagePrice.CostExtra = CalcPackageCostExtra(calcSetting)
- packagePrice.CostExtra = utils.FloatAddSlice([]float64{2000, utils.FloatMul(12, houseParam.Area, 4)}, 4)
- // 完工补贴
- packagePrice.FinishExtra = 500 + 1500 + 350
- // 套餐总报价
- packagePrice.Cost = utils.FloatAddSlice([]float64{packagePrice.BuildPrice.TotalCost, packagePrice.Material, packagePrice.CostExtra, packagePrice.FinishExtra}, -1)
- packagePrice.Total = utils.FloatDiv(packagePrice.Cost, utils.FloatSub(1, pkgInfo.ProfitRate, -1), -1)
- if form.Area > 100 {
- packagePrice.Total = utils.FloatDiv(packagePrice.Total, pkgInfo.DiscountRate100, 4)
- } else {
- packagePrice.Total = utils.FloatDiv(packagePrice.Total, pkgInfo.DiscountRate, 4)
- }
- toiletPrice.BuildPrice.Total = toiletPrice.BuildPrice.Direct
- toiletPrice.BuildPrice.TotalCost = utils.FloatMul(pkgInfo.PackageRate, toiletPrice.BuildPrice.Total, 4)
- toiletPrice.BuildPrice.TotalCost = utils.FloatMul(1.15, toiletPrice.BuildPrice.TotalCost, 4)
- toiletPrice.CostExtra = 0
- toiletPrice.FinishExtra = 0
- toiletPrice.Cost = utils.FloatAddSlice([]float64{toiletPrice.BuildPrice.TotalCost, toiletPrice.Material, toiletPrice.CostExtra, toiletPrice.FinishExtra}, -1)
- toiletPrice.Total = utils.FloatDiv(toiletPrice.Cost, utils.FloatSub(1, pkgInfo.ToiletRate, -1), -1)
- //fmt.Println("总面积:"+ utils.ToStr(houseParam.Area))
- //fmt.Println("套餐内施工直接费:"+ utils.ToStr(packagePrice.BuildPrice.Direct))
- //fmt.Println("套餐内施工制图费:"+ utils.ToStr(packagePrice.BuildPrice.Design))
- //fmt.Println("套餐内施工搬运费:"+ utils.ToStr(packagePrice.BuildPrice.Transport))
- //fmt.Println("套餐内施工卫生费:"+ utils.ToStr(packagePrice.BuildPrice.Sanitation))
- //fmt.Println("套餐内施工管理费:"+ utils.ToStr(packagePrice.BuildPrice.Manage))
- //fmt.Println("套餐内水泥补贴:"+ utils.ToStr(packagePrice.BuildPrice.CementExtra))
- //fmt.Println("套餐内施工总价:"+ utils.ToStr(packagePrice.BuildPrice.Total))
- //fmt.Println("套餐内施工成本:"+ utils.ToStr(packagePrice.BuildPrice.TotalCost))
- //fmt.Println("套餐内主材成本:"+ utils.ToStr(packagePrice.Material))
- //fmt.Println("套餐内补贴成本:"+ utils.ToStr(packagePrice.CostExtra))
- //fmt.Println("套餐内完工补贴:"+ utils.ToStr(packagePrice.FinishExtra))
- //fmt.Println("套餐内总报价:"+ utils.ToStr(packagePrice.Total)+"(施工成本+主材成本+补贴成本+完工补贴)/ "+utils.ToStr(1-pkgInfo.ProfitRate)+")/ 0.88")
- // 个性化
- var customizePrice calc.CustomizePrice
- for category, items := range form.Customize {
- money := float64(0)
- for k, v := range items {
- if v.Num <= 0 {
- continue
- }
- bidItem := bidMap[v.ID]
- if bidItem != nil {
- price := CalcBidCustomizeMoney(v.Num, bidItem)
- money = utils.FloatAdd(money, price, 4)
- v.Total = price
- items[k] = v
- }
- }
- switch category {
- case 3:
- customizePrice.BuildPrice.Direct = money
- case 4:
- customizePrice.MaterialAdd = money
- case 5:
- customizePrice.MaterialDel = 0 - money
- case 6:
- customizePrice.MaterialUpgrade = money
- case 11:
- customizePrice.Design = money
- }
- }
- //customizePrice.BuildPrice.Transport = utils.FloatMul(customizePrice.BuildPrice.Direct, pkgInfo.TransportRate, 4)
- //customizePrice.BuildPrice.Sanitation= utils.FloatMul(customizePrice.BuildPrice.Direct, pkgInfo.SanitationRate, 4)
- //customizePrice.BuildPrice.Manage = utils.FloatMul(utils.FloatAddSlice([]float64{customizePrice.BuildPrice.Direct, customizePrice.BuildPrice.Transport, customizePrice.BuildPrice.Sanitation}, -1), pkgInfo.ManageRate, 4)
- //customizePrice.BuildPrice.Total = utils.FloatAddSlice([]float64{customizePrice.BuildPrice.Direct, customizePrice.BuildPrice.Manage,customizePrice.BuildPrice.Sanitation, customizePrice.BuildPrice.Transport}, 4)
- customizePrice.BuildPrice.Total = customizePrice.BuildPrice.Direct
- customizePrice.Build = customizePrice.BuildPrice.Total
- customizePriceRate := utils.FloatAddSlice([]float64{customizePrice.BuildPrice.Direct, customizePrice.MaterialAdd, customizePrice.MaterialUpgrade}, -1)
- customizePrice.Transport = utils.FloatMul(customizePriceRate, transportRate, 4)
- customizePrice.Sanitation = utils.FloatMul(customizePriceRate, transportRate, 4)
- customizePrice.Manage = utils.FloatMul(utils.FloatAddSlice([]float64{customizePriceRate, customizePrice.Transport, customizePrice.Sanitation}, -1), pkgInfo.ManageRate, 4)
- customizePrice.Total = utils.FloatAddSlice([]float64{customizePrice.MaterialAdd, customizePrice.MaterialDel, customizePrice.MaterialUpgrade, customizePrice.Build, customizePrice.Design}, -1)
- customizePrice.Total = utils.FloatAddSlice([]float64{customizePrice.Total, customizePrice.Transport, customizePrice.Sanitation, customizePrice.Manage}, 4)
- customizePrice.Cost = utils.FloatAddSlice([]float64{utils.FloatMul(customizePrice.Build, utils.FloatSub(1, pkgInfo.BuildCustomizeRate, -1), -1), utils.FloatMul(utils.FloatAddSlice([]float64{customizePrice.MaterialAdd, customizePrice.MaterialDel, customizePrice.MaterialUpgrade}, -1), utils.FloatSub(1, pkgInfo.MaterialCustomizeRate, -1), -1), customizePrice.Design}, -1)
- //fmt.Println("------------")
- //fmt.Println("个性化施工增项报价:"+ utils.ToStr(customizePrice.Build))
- //fmt.Println("个性化主材增项报价:"+ utils.ToStr(customizePrice.MaterialAdd))
- //fmt.Println("个性化主材减项报价:"+ utils.ToStr(customizePrice.MaterialDel))
- //fmt.Println("个性化主材升级报价:"+ utils.ToStr(customizePrice.MaterialUpgrade))
- //fmt.Println("个性化设计费:"+ utils.ToStr(customizePrice.Design))
- //fmt.Println("个性化总报价:"+ utils.ToStr(customizePrice.Total))
- //fmt.Println("------------")
- //fmt.Println("定制品:"+ utils.ToStr(inclusivePrice.Diy))
- //fmt.Println("家具:"+ utils.ToStr(inclusivePrice.Furniture))
- //fmt.Println("灯具:"+ utils.ToStr(inclusivePrice.Lamp))
- //fmt.Println("窗帘:"+ utils.ToStr(inclusivePrice.Curtain))
- if true || form.IsInclusive == 1 {
- inclusivePrice.Total = utils.FloatAddSlice([]float64{inclusivePrice.Diy, inclusivePrice.Furniture, inclusivePrice.Lamp, inclusivePrice.Curtain}, -1)
- inclusiveCost.Total = utils.FloatAddSlice([]float64{inclusiveCost.Diy, inclusiveCost.Furniture, inclusiveCost.Lamp, inclusiveCost.Curtain, inclusiveCost.Prize, inclusiveCost.Deposit, inclusiveCost.Appliances}, -1)
- } else {
- inclusivePrice.Total = 0
- inclusiveCost.Total = 0
- }
- //fmt.Println("定制品总金额:"+ utils.ToStr(inclusivePrice.Total))
- //fmt.Println("------------")
- money := utils.FloatAddSlice([]float64{packagePrice.Total, customizePrice.Total, inclusivePrice.Total, toiletPrice.Total}, 0)
- //fmt.Println("总报价:"+ utils.ToStr(money))
- //fmt.Println("------------")
- baseDiscount := utils.FloatDiv(utils.FloatSub(utils.FloatAdd(packagePrice.Total, inclusivePrice.Total, -1), inclusiveCost.Total, -1), packagePrice.Total, -1)
- if baseDiscount < pkgInfo.MinDiscount {
- //total := utils.FloatSub(inclusiveCost.Total, utils.FloatMul(utils.FloatSub(1, pkgInfo.MinDiscount, -1), packagePrice.Total, -1), -1)
- //inclusivePrice.Discount = utils.FloatSub(total, inclusivePrice.Total, -1)
- //inclusivePrice.Total = total
- baseDiscount = pkgInfo.MinDiscount
- money = utils.FloatAddSlice([]float64{packagePrice.Total, customizePrice.Total, inclusivePrice.Total}, 0)
- }
- baseInterestRate := utils.FloatSub(1, utils.FloatDiv(packagePrice.Cost, utils.FloatSub(utils.FloatAdd(packagePrice.Total, inclusivePrice.Total, -1), inclusiveCost.Total, -1), -1), -1)
- interestRate := utils.FloatSub(1, utils.FloatDiv(utils.FloatSub(utils.FloatAdd(packagePrice.Cost, customizePrice.Cost, -1), customizePrice.Design, -1), utils.FloatSubSlice([]float64{utils.FloatAddSlice([]float64{packagePrice.Total, inclusivePrice.Total, customizePrice.Total}, -1), inclusiveCost.Total, customizePrice.Design}, -1), -1), -1)
- if form.PkgID == 45 || form.PkgID == 50 {
- if form.Area == 80 {
- if form.HouseStyle[0].Num == 2 && form.HouseStyle[1].Num <= 2 && form.HouseStyle[2].Num == 1 && form.HouseStyle[3].Num == 1 && form.HouseStyle[4].Num == 1 {
- money = 99980
- }
- }
- }
- if form.PkgID == 48 {
- if form.Area == 100 {
- if form.HouseStyle[0].Num == 2 && form.HouseStyle[1].Num <= 2 && form.HouseStyle[2].Num == 1 && form.HouseStyle[3].Num == 1 && form.HouseStyle[4].Num == 1 {
- money = 99980
- }
- }
- }
- if form.PkgID == 47 {
- if form.Area == 100 {
- if form.HouseStyle[0].Num == 2 && form.HouseStyle[1].Num <= 2 && form.HouseStyle[2].Num == 1 && form.HouseStyle[3].Num == 1 && form.HouseStyle[4].Num == 1 {
- money = 121800
- }
- }
- }
- return calc.PriceReturn{
- PackagePrice: packagePrice.Total,
- PackagePriceDetail: utils.JsonEncode(packagePrice),
- CustomizePrice: customizePrice.Total,
- CustomizePriceDetail: utils.JsonEncode(customizePrice),
- InclusivePrice: inclusivePrice.Total,
- InclusivePriceDetail: utils.JsonEncode(inclusivePrice),
- InclusiveCost: inclusiveCost.Total,
- InclusiveCostDetail: utils.JsonEncode(inclusiveCost),
- ToiletPrice: toiletPrice.Total,
- ToiletPriceDetail: utils.JsonEncode(toiletPrice),
- BaseDiscount: baseDiscount,
- BaseInterestRate: baseInterestRate,
- InterestRate: interestRate,
- HouseArea: houseParam.Area,
- TotalPrice: money,
- Customize: utils.JsonEncode(form.Customize),
- Param: utils.JsonEncode(form.Param),
- TransportRate: transportRate,
- IsElevator: form.IsElevator,
- FloorNum: form.FloorNum,
- }, nil
- }
- func getOrderMap(f form.MaterialBidOrderAdd) (map[string]interface{}, error) {
- res, err := Calc(form.MaterialBidDetailCalc{
- PkgID: f.PkgID,
- Type: f.Type,
- Area: f.Area,
- Param: f.Param,
- HouseStyle: f.HouseStyle,
- Customize: f.Customize,
- IsElevator: f.IsElevator,
- InclusiveArea: f.InclusiveArea,
- FloorNum: f.FloorNum,
- })
- if err != nil {
- return nil, err
- }
- orderMap := map[string]interface{}{
- "pkg_id": f.PkgID,
- "type": f.Type,
- "customer_name": f.CustomerName,
- "customer_phone": f.CustomerPhone,
- "house_address": f.HouseAddress,
- "house_area": res.HouseArea,
- "house_style": utils.JsonEncode(f.HouseStyle),
- "param": res.Param,
- "customize": res.Customize,
- "user_id": user.CreateNewUser(f.CustomerName, f.CustomerPhone),
- "package_price": res.PackagePrice,
- "package_price_detail": res.PackagePriceDetail,
- "customize_price": res.CustomizePrice,
- "customize_price_detail": res.CustomizePriceDetail,
- "inclusive_price": res.InclusivePrice,
- "inclusive_price_detail": res.InclusivePriceDetail,
- "inclusive_cost": res.InclusiveCost,
- "inclusive_cost_detail": res.InclusiveCostDetail,
- "toilet_price": res.ToiletPrice,
- "toilet_price_detail": res.ToiletPriceDetail,
- "total_price": res.TotalPrice,
- "base_discount": res.BaseDiscount,
- "base_interest_rate": res.BaseInterestRate,
- "interest_rate": res.InterestRate,
- "profit_rate": res.ProfitRate,
- "is_elevator": res.IsElevator,
- "floor_num": res.FloorNum,
- "inclusive_area": f.InclusiveArea,
- "transport_rate": res.TransportRate,
- }
- return orderMap, nil
- }
- func EditOrder(f form.MaterialBidOrderAdd, id int) (int64, error) {
- orderMap, err := getOrderMap(f)
- if err != nil {
- return 0, err
- }
- return db.Update(MatBidOrder.TableName(), map[string]interface{}{"id": id}, orderMap)
- }
- func UpdateOrder(id int) (int64, error) {
- var orderInfo structs.MaterialBidOrderList
- if _, err := GetOrder(map[string]interface{}{"id": id}, nil, &orderInfo); err != nil {
- return 0, err
- }
- var houseStyle []structs.HouseStyle
- utils.JsonDecode(orderInfo.HouseStyle).To(&houseStyle)
- utils.JsonDecode(orderInfo.Param).To(&orderInfo.ParamDecode)
- utils.JsonDecode(orderInfo.Customize).To(&orderInfo.CustomizeDecode)
- orderInfo.ParamDecode = orderInfo.ParamDecode[:len(orderInfo.ParamDecode)-1]
- addForm := form.MaterialBidOrderAdd{
- PkgID: orderInfo.PkgID,
- AdminID: orderInfo.AdminID,
- CustomerPhone: orderInfo.CustomerPhone,
- CustomerName: orderInfo.CustomerName,
- HouseStyle: houseStyle,
- HouseAddress: orderInfo.HouseAddress,
- Param: orderInfo.ParamDecode,
- Customize: orderInfo.CustomizeDecode,
- }
- return EditOrder(addForm, id)
- }
- func AddOrder(f form.MaterialBidOrderAdd) (int64, error) {
- orderMap, err := getOrderMap(f)
- if err != nil {
- return 0, err
- }
- orderMap["admin_id"] = f.AdminID
- return db.InsertOne(MatBidOrder.TableName(), orderMap)
- }
- func RemarkOrder(form form.OrderRemark, id int) error {
- db.Update(MatBidOrder.TableName(), map[string]interface{}{"id": id}, map[string]interface{}{"remarks": form.Content})
- return nil
- }
- func FinishOrder(id int) error {
- _, err := db.Update(MatBidOrder.TableName(), map[string]interface{}{"id": id}, map[string]interface{}{"state": bidParam.OrderState.Finished})
- return err
- }
- func DelOrder(id int) error {
- _, err := db.DeleteSoft(MatBidOrder.TableName(), map[string]interface{}{"id": id})
- return err
- }
|