order.go 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683
  1. package bid
  2. import (
  3. "zhiyuan/models"
  4. "zhiyuan/pkg/app"
  5. "zhiyuan/pkg/db"
  6. "zhiyuan/pkg/param/material"
  7. bidParam "zhiyuan/pkg/param/material/bid"
  8. "zhiyuan/pkg/utils"
  9. "zhiyuan/services/form"
  10. "zhiyuan/services/structs"
  11. "zhiyuan/services/structs/calc"
  12. "zhiyuan/services/user"
  13. )
  14. var MatBidOrder models.MatBidOrder
  15. func GetOrders(where map[string]interface{}, fields []string, page app.Page, retVal interface{}) ([]*models.MatBidOrder, error) {
  16. if page.PageNum > 0 && page.PageSize > 0 {
  17. where["_limit"] = db.GetOffset(uint(page.PageNum), uint(page.PageSize))
  18. }
  19. return MatBidOrder.GetMulti(where, fields, retVal)
  20. }
  21. func CountOrder(where map[string]interface{}) (int64, error) {
  22. return db.Count(MatBidOrder.TableName(), where)
  23. }
  24. func GetOrder(where map[string]interface{}, fields []string, dest interface{}) (*models.MatBidOrder, error) {
  25. return MatBidOrder.GetOne(where, fields, dest)
  26. }
  27. func CountRaw(where string, param map[string]interface{}) (int64, error) {
  28. query := "`zy_mat_bid_order` left join `zy_admin` on `zy_admin`.`id` = `zy_mat_bid_order`.`admin_id` WHERE " + where
  29. return db.CountRaw(query, param)
  30. }
  31. func GetOrdersRaw(where map[string]string, param map[string]interface{}, retVal interface{}) error {
  32. 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` "
  33. return db.GetMultiRaw(field, where, param, retVal)
  34. }
  35. func OutputPriceDetail(id int) error {
  36. var orderInfo *structs.MaterialBidOrderList
  37. if _, err := GetOrder(map[string]interface{}{"id": id}, nil, &orderInfo); err != nil {
  38. return err
  39. }
  40. bidList := make([]*structs.MaterialBidList, 0)
  41. if _, err := GetBidList(map[string]interface{}{"pkg_id": orderInfo.PkgID}, nil, app.Page{}, &bidList); err != nil {
  42. return err
  43. }
  44. bidListMap := make(map[int][]*structs.MaterialBidList)
  45. bidMap := make(map[int]*structs.MaterialBidList)
  46. for _, v := range material.Params.RoomType {
  47. bidListMap[v.ID] = make([]*structs.MaterialBidList, 0)
  48. }
  49. for _, v := range bidList {
  50. bidMap[v.ID] = v
  51. }
  52. return nil
  53. }
  54. func GetTransportRate(baseRate float64, isElevator int, floorNum int) float64 {
  55. if isElevator == 0 && floorNum > 2 {
  56. baseRate = utils.FloatAdd(baseRate, utils.FloatMul(float64(floorNum-2), 0.005, -1), 4)
  57. }
  58. return baseRate
  59. }
  60. func CalcToilet(form1 form.MaterialBidDetailCalc1) (calc.PriceReturn, error) {
  61. var pkg models.MatPkg
  62. pkgInfo, _ := pkg.GetOne(map[string]interface{}{"id": form1.PkgID}, nil, nil)
  63. bidList := make([]*structs.MaterialBidList, 0)
  64. if _, err := GetBidList(map[string]interface{}{"pkg_id": form1.PkgID}, nil, app.Page{}, &bidList); err != nil {
  65. return calc.PriceReturn{}, err
  66. }
  67. bidListMap := make(map[int][]*structs.MaterialBidList)
  68. bidMap := make(map[int]*structs.MaterialBidList)
  69. for _, v := range material.Params.RoomType {
  70. bidListMap[v.ID] = make([]*structs.MaterialBidList, 0)
  71. }
  72. for _, v := range bidList {
  73. if v.CalcParam != "" {
  74. utils.JsonDecode(v.CalcParam).To(&v.CalcParamDecode)
  75. }
  76. bidMap[v.ID] = v
  77. bidListMap[v.RoomType] = append(bidListMap[v.RoomType], v)
  78. }
  79. transportRate := GetTransportRate(pkgInfo.TransportRate, 0, 0)
  80. // 套餐内
  81. var packagePrice calc.PackagePrice
  82. calcSetting := structs.MaterialBidCalcSetting{RoomNum: 0, ToiletNum: 1, RestaurantNum: 0, KitchenNum: 0}
  83. param := []structs.MaterialBidOrderParam{{RoomType: 4, RoomName: "卫生间", Area: form1.Area, Round: form1.Round, Hole: 0, Window: 0}}
  84. for _, v := range param {
  85. if v.RoomType == 4 {
  86. holeArea := utils.FloatMul(v.Hole, 2, -1)
  87. wallArea := utils.FloatMul(v.Round, 2.4, -1)
  88. calcSetting.ToiletWallArea = wallArea - holeArea
  89. }
  90. }
  91. var inclusivePrice calc.InclusivePrice
  92. var inclusiveCost calc.InclusiveCost
  93. formCalc := form.MaterialBidDetailCalc{}
  94. for k, v := range param {
  95. bidItems := bidListMap[0]
  96. //fmt.Println(v.RoomName+ " 面积:"+utils.ToStr(v.Area)+ " 周长:"+utils.ToStr(v.Round)+ " 门洞:"+utils.ToStr(v.Hole)+ " 窗宽:"+utils.ToStr(v.Window))
  97. //fmt.Println("====================================================")
  98. v.Items = make([]structs.MaterialBidOrderItem, 0)
  99. for _, bidItem := range bidItems {
  100. price := CalcBidItemMoney(v, bidItem, calcSetting, formCalc)
  101. if bidItem.Category == 30 || bidItem.Category == 31 {
  102. switch bidItem.Category {
  103. case 30:
  104. //fmt.Println("施工—-"+bidItem.BidName+":"+utils.ToStr(price))
  105. packagePrice.BuildPrice.Direct = utils.FloatAdd(packagePrice.BuildPrice.Direct, price, 4)
  106. case 31:
  107. //fmt.Println("主材—-"+bidItem.BidName+":"+utils.ToStr(price))
  108. packagePrice.Material = utils.FloatAdd(packagePrice.Material, price, 4)
  109. }
  110. v.Items = append(v.Items, structs.MaterialBidOrderItem{
  111. Price: price,
  112. ID: bidItem.ID,
  113. BidName: bidItem.BidName,
  114. })
  115. }
  116. }
  117. param[k] = v
  118. //fmt.Println("")
  119. }
  120. //packagePrice.BuildPrice.Transport = utils.FloatMul(packagePrice.BuildPrice.Direct, transportRate, 4)
  121. //packagePrice.BuildPrice.Manage = utils.FloatMul(utils.FloatAddSlice([]float64{packagePrice.BuildPrice.Direct, packagePrice.BuildPrice.Sanitation, packagePrice.BuildPrice.Transport}, -1), pkgInfo.ManageRate, 4)
  122. //packagePrice.BuildPrice.CementExtra = utils.FloatMul(houseParam.Area, 10, -1)
  123. //packagePrice.BuildPrice.Design = utils.FloatMul(houseParam.Area, pkgInfo.DesignFee, 4)
  124. packagePrice.BuildPrice.Total = packagePrice.BuildPrice.Direct
  125. packagePrice.BuildPrice.TotalCost = utils.FloatMul(pkgInfo.PackageRate, packagePrice.BuildPrice.Total, 4)
  126. packagePrice.BuildPrice.TotalCost = utils.FloatMul(1.15, packagePrice.BuildPrice.TotalCost, 4)
  127. // 套餐补贴成本
  128. //packagePrice.CostExtra = CalcPackageCostExtra(calcSetting)
  129. packagePrice.CostExtra = 0
  130. // 完工补贴
  131. packagePrice.FinishExtra = 0
  132. // 套餐总报价
  133. packagePrice.Cost = utils.FloatAddSlice([]float64{packagePrice.BuildPrice.TotalCost, packagePrice.Material, packagePrice.CostExtra, packagePrice.FinishExtra}, -1)
  134. packagePrice.Total = utils.FloatDiv(packagePrice.Cost, utils.FloatSub(1, pkgInfo.ToiletRate, -1), -1)
  135. //packagePrice.Total = utils.FloatDiv(packagePrice.Total, pkgInfo.DiscountRate, 4)
  136. //fmt.Println("定制品总金额:"+ utils.ToStr(inclusivePrice.Total))
  137. //fmt.Println("------------")
  138. money := utils.FloatAddSlice([]float64{packagePrice.Total, 0, inclusivePrice.Total}, 0)
  139. //fmt.Println("总报价:"+ utils.ToStr(money))
  140. //fmt.Println("------------")
  141. /*baseDiscount := utils.FloatDiv(utils.FloatSub(utils.FloatAdd(packagePrice.Total, inclusivePrice.Total, -1), inclusiveCost.Total, -1), packagePrice.Total, -1)
  142. if baseDiscount < pkgInfo.MinDiscount {
  143. total := utils.FloatSub(inclusiveCost.Total, utils.FloatMul(utils.FloatSub(1, pkgInfo.MinDiscount, -1), packagePrice.Total, -1), -1)
  144. inclusivePrice.Discount = utils.FloatSub(total, inclusivePrice.Total, -1)
  145. inclusivePrice.Total = total
  146. baseDiscount = pkgInfo.MinDiscount
  147. money = utils.FloatAddSlice([]float64{packagePrice.Total, 0, inclusivePrice.Total}, 0)
  148. }
  149. baseInterestRate := utils.FloatSub(1, utils.FloatDiv(packagePrice.Cost, utils.FloatSub(utils.FloatAdd(packagePrice.Total, inclusivePrice.Total, -1), inclusiveCost.Total, -1), -1), -1)
  150. 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)*/
  151. return calc.PriceReturn{
  152. PackagePrice: packagePrice.Total,
  153. PackagePriceDetail: utils.JsonEncode(packagePrice),
  154. CustomizePrice: 0,
  155. CustomizePriceDetail: "",
  156. InclusivePrice: inclusivePrice.Total,
  157. InclusivePriceDetail: utils.JsonEncode(inclusivePrice),
  158. InclusiveCost: inclusiveCost.Total,
  159. InclusiveCostDetail: utils.JsonEncode(inclusiveCost),
  160. BaseDiscount: 0,
  161. BaseInterestRate: 0,
  162. InterestRate: 0,
  163. HouseArea: form1.Area,
  164. TotalPrice: money,
  165. Customize: "",
  166. Param: utils.JsonEncode(param),
  167. TransportRate: transportRate,
  168. IsElevator: 0,
  169. FloorNum: 0,
  170. }, nil
  171. }
  172. func Calc(form form.MaterialBidDetailCalc) (calc.PriceReturn, error) {
  173. var pkg models.MatPkg
  174. pkgInfo, _ := pkg.GetOne(map[string]interface{}{"id": form.PkgID}, nil, nil)
  175. if form.Type == 1 {
  176. var outline calc.Outline
  177. utils.JsonDecode(pkgInfo.Outline).To(&outline)
  178. var outlinePrice calc.OutlinePrice
  179. roomNum := float64(0) // 房间数量
  180. kitchenNum := float64(0) // 厨房数量
  181. toiletNum := float64(0) // 卫生间数量
  182. addRoomNum := float64(0) // 附加房间数量
  183. addKitchenNum := float64(0) // 附加厨房数量
  184. addToiletNum := float64(0) // 附加卫生间数量
  185. for _, v := range form.HouseStyle {
  186. if v.Type == 1 {
  187. roomNum = utils.ToFloat64(v.Num)
  188. } else if v.Type == 3 {
  189. kitchenNum = utils.ToFloat64(v.Num)
  190. } else if v.Type == 4 {
  191. toiletNum = utils.ToFloat64(v.Num)
  192. }
  193. }
  194. if roomNum > outline.RoomNum {
  195. addRoomNum = roomNum - outline.RoomNum
  196. }
  197. if kitchenNum > outline.KitchenNum {
  198. addKitchenNum = kitchenNum - outline.KitchenNum
  199. }
  200. if toiletNum > outline.ToiletNum {
  201. addToiletNum = toiletNum - outline.ToiletNum
  202. }
  203. outlinePrice.Area = utils.FloatMul(form.Area, outline.InsideScale, -1)
  204. outlinePrice.RoomPrice = utils.FloatMul(addRoomNum, outline.RoomPrice, -1)
  205. outlinePrice.KitchenPrice = utils.FloatMul(addKitchenNum, outline.KitchenPrice, -1)
  206. outlinePrice.ToiletPrice = utils.FloatMul(addToiletNum, outline.ToiletPrice, -1)
  207. areaMax := float64(0)
  208. areaPrice := float64(0)
  209. areaMin := float64(0)
  210. areaPriceMin := float64(0)
  211. for _, v := range outline.AreaPrice {
  212. if v.Area <= outlinePrice.Area && v.Area > areaMax {
  213. areaMax = v.Area
  214. areaPrice = v.Price
  215. }
  216. if areaMin == 0 || areaMin > v.Area {
  217. areaMin = v.Area
  218. areaPriceMin = v.Price
  219. }
  220. }
  221. if areaMax == 0 {
  222. outlinePrice.Area = areaMin
  223. areaPrice = areaPriceMin
  224. }
  225. //outlinePrice.AreaPrice = utils.FloatMul(outlinePrice.Area, areaPrice, -1)
  226. outlinePrice.AreaPrice = areaPrice
  227. outlinePrice.DiscountPrice = utils.FloatAddSlice([]float64{outlinePrice.AreaPrice, outlinePrice.RoomPrice, outlinePrice.KitchenPrice, outlinePrice.ToiletPrice}, -1)
  228. for _, v := range outline.ExtraItem {
  229. extraMoney := float64(0)
  230. switch v.Type {
  231. case 0:
  232. extraMoney = v.Price
  233. case 1:
  234. extraMoney = utils.FloatMul(outlinePrice.Area, v.Price, -1)
  235. case 2:
  236. extraMoney = utils.FloatMul(roomNum, v.Price, -1)
  237. case 3:
  238. extraMoney = utils.FloatMul(kitchenNum, v.Price, -1)
  239. case 4:
  240. extraMoney = utils.FloatMul(toiletNum, v.Price, -1)
  241. case 5:
  242. extraMoney = utils.FloatMul(addRoomNum, v.Price, -1)
  243. case 6:
  244. extraMoney = utils.FloatMul(addKitchenNum, v.Price, -1)
  245. case 7:
  246. extraMoney = utils.FloatMul(addToiletNum, v.Price, -1)
  247. }
  248. outlinePrice.ExtraItemPrice = append(outlinePrice.ExtraItemPrice, calc.ExtraItemPrice{
  249. Name: v.Name,
  250. Price: extraMoney,
  251. })
  252. outlinePrice.DiscountPrice = utils.FloatAdd(outlinePrice.DiscountPrice, extraMoney, -1)
  253. }
  254. outlinePrice.Total = utils.FloatDiv(outlinePrice.DiscountPrice, outline.DiscountScale, -1)
  255. /*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)
  256. compute2 := utils.FloatMul(utils.FloatSubSlice([]float64{Area, 5.4, utils.FloatMul(toiletNum, 3.6, -1)}, -1), 572, -1)
  257. compute3 := utils.FloatAdd(utils.FloatMul(5.4, 960.17, -1), utils.FloatMulSlice([]float64{toiletNum, 3.6, 960.17}, -1), -1)
  258. compute4 := utils.FloatAddSlice([]float64{compute1, compute2, compute3}, -1)
  259. compute5 := utils.FloatSub(compute4, utils.FloatMulSlice([]float64{Area, 0.4, 490}, -1), -1)
  260. compute5 = utils.FloatDiv(compute5, 0.546, -1)
  261. money := utils.FloatAdd(compute5, 69923, 0)*/
  262. return calc.PriceReturn{
  263. HouseArea: form.Area,
  264. PackagePrice: outlinePrice.DiscountPrice,
  265. PackagePriceDetail: utils.JsonEncode(outlinePrice),
  266. TotalPrice: outlinePrice.Total,
  267. OutlinePrice: outlinePrice,
  268. }, nil
  269. }
  270. bidList := make([]*structs.MaterialBidList, 0)
  271. if _, err := GetBidList(map[string]interface{}{"pkg_id": form.PkgID}, nil, app.Page{}, &bidList); err != nil {
  272. return calc.PriceReturn{}, err
  273. }
  274. bidListMap := make(map[int][]*structs.MaterialBidList)
  275. bidMap := make(map[int]*structs.MaterialBidList)
  276. for _, v := range material.Params.RoomType {
  277. bidListMap[v.ID] = make([]*structs.MaterialBidList, 0)
  278. }
  279. for _, v := range bidList {
  280. if v.CalcParam != "" {
  281. utils.JsonDecode(v.CalcParam).To(&v.CalcParamDecode)
  282. }
  283. bidMap[v.ID] = v
  284. bidListMap[v.RoomType] = append(bidListMap[v.RoomType], v)
  285. }
  286. transportRate := GetTransportRate(pkgInfo.TransportRate, form.IsElevator, form.FloorNum)
  287. // 套餐内
  288. var packagePrice calc.PackagePrice
  289. var toiletPrice calc.PackagePrice
  290. calcSetting := GetCalcSetting(form.HouseStyle)
  291. houseParam := structs.MaterialBidOrderParam{RoomType: 0, RoomName: "全房", Area: 0, Round: 0, Hole: 0, Window: 0}
  292. for _, v := range form.Param {
  293. if v.RoomType == 3 {
  294. calcSetting.KitchenHole = v.Hole
  295. holeArea := utils.FloatMul(v.Hole, 2, -1)
  296. wallArea := utils.FloatMul(v.Round, 2.4, -1)
  297. calcSetting.KitchenWallArea = wallArea - holeArea
  298. } else if v.RoomType == 4 {
  299. holeArea := utils.FloatMul(v.Hole, 2, -1)
  300. wallArea := utils.FloatMul(v.Round, 2.4, -1)
  301. calcSetting.ToiletWallArea = wallArea - holeArea
  302. } else if v.RoomType == 5 {
  303. calcSetting.BalconyArea = v.Area
  304. calcSetting.BalconyHole = v.Hole
  305. calcSetting.BalconyRound = v.Round
  306. calcSetting.BalconyWindow = v.Window
  307. }
  308. houseParam.Area = utils.FloatAdd(houseParam.Area, v.Area, 2)
  309. }
  310. if form.Area != 0 {
  311. houseParam.Area = form.Area
  312. }
  313. form.Param = append(form.Param, houseParam)
  314. var inclusivePrice calc.InclusivePrice
  315. var inclusiveCost calc.InclusiveCost
  316. for k, v := range form.Param {
  317. if v.RoomType == 4 && v.RoomName != "卫生间1" {
  318. bidItems := bidListMap[0]
  319. //fmt.Println(v.RoomName+ " 面积:"+utils.ToStr(v.Area)+ " 周长:"+utils.ToStr(v.Round)+ " 门洞:"+utils.ToStr(v.Hole)+ " 窗宽:"+utils.ToStr(v.Window))
  320. //fmt.Println("====================================================")
  321. v.Items = make([]structs.MaterialBidOrderItem, 0)
  322. for _, bidItem := range bidItems {
  323. price := CalcBidItemMoney(v, bidItem, calcSetting, form)
  324. if bidItem.Category == 30 || bidItem.Category == 31 {
  325. switch bidItem.Category {
  326. case 30:
  327. //fmt.Println("施工—-"+bidItem.BidName+":"+utils.ToStr(price))
  328. toiletPrice.BuildPrice.Direct = utils.FloatAdd(toiletPrice.BuildPrice.Direct, price, 4)
  329. case 31:
  330. //fmt.Println("主材—-"+bidItem.BidName+":"+utils.ToStr(price))
  331. toiletPrice.Material = utils.FloatAdd(toiletPrice.Material, price, 4)
  332. }
  333. v.Items = append(v.Items, structs.MaterialBidOrderItem{
  334. Price: price,
  335. ID: bidItem.ID,
  336. BidName: bidItem.BidName,
  337. })
  338. }
  339. }
  340. } else {
  341. bidItems := bidListMap[v.RoomType]
  342. //fmt.Println(v.RoomName+ " 面积:"+utils.ToStr(v.Area)+ " 周长:"+utils.ToStr(v.Round)+ " 门洞:"+utils.ToStr(v.Hole)+ " 窗宽:"+utils.ToStr(v.Window))
  343. //fmt.Println("====================================================")
  344. v.Items = make([]structs.MaterialBidOrderItem, 0)
  345. for _, bidItem := range bidItems {
  346. price := CalcBidItemMoney(v, bidItem, calcSetting, form)
  347. if bidItem.Level == 1 || bidItem.Level == 3 {
  348. switch bidItem.Category {
  349. case 1:
  350. packagePrice.BuildPrice.Direct = utils.FloatAdd(packagePrice.BuildPrice.Direct, price, 4)
  351. case 2:
  352. packagePrice.Material = utils.FloatAdd(packagePrice.Material, price, 4)
  353. case 12:
  354. inclusivePrice.Diy = utils.FloatAdd(inclusivePrice.Diy, price, 4)
  355. case 13:
  356. inclusivePrice.Furniture = utils.FloatAdd(inclusivePrice.Furniture, price, 4)
  357. case 14:
  358. inclusivePrice.Lamp = utils.FloatAdd(inclusivePrice.Lamp, price, 4)
  359. case 15:
  360. inclusivePrice.Curtain = utils.FloatAdd(inclusivePrice.Curtain, price, 4)
  361. case 21:
  362. inclusiveCost.Diy = utils.FloatAdd(inclusiveCost.Diy, price, 4)
  363. case 22:
  364. inclusiveCost.Furniture = utils.FloatAdd(inclusiveCost.Furniture, price, 4)
  365. case 23:
  366. inclusiveCost.Lamp = utils.FloatAdd(inclusiveCost.Lamp, price, 4)
  367. case 24:
  368. inclusiveCost.Curtain = utils.FloatAdd(inclusiveCost.Curtain, price, 4)
  369. case 25:
  370. inclusiveCost.Prize = utils.FloatAdd(inclusiveCost.Prize, price, 4)
  371. case 26:
  372. inclusiveCost.Deposit = utils.FloatAdd(inclusiveCost.Deposit, price, 4)
  373. case 27:
  374. inclusiveCost.Appliances = utils.FloatAdd(inclusiveCost.Appliances, price, 4)
  375. }
  376. v.Items = append(v.Items, structs.MaterialBidOrderItem{
  377. Price: price,
  378. ID: bidItem.ID,
  379. BidName: bidItem.BidName,
  380. })
  381. }
  382. }
  383. }
  384. form.Param[k] = v
  385. //fmt.Println("")
  386. }
  387. packagePrice.BuildPrice.Sanitation = utils.FloatMul(packagePrice.BuildPrice.Direct, transportRate, 4)
  388. packagePrice.BuildPrice.Transport = utils.FloatMul(packagePrice.BuildPrice.Direct, transportRate, 4)
  389. packagePrice.BuildPrice.Manage = utils.FloatMul(utils.FloatAddSlice([]float64{packagePrice.BuildPrice.Direct, packagePrice.BuildPrice.Sanitation, packagePrice.BuildPrice.Transport}, -1), pkgInfo.ManageRate, 4)
  390. packagePrice.BuildPrice.CementExtra = utils.FloatMul(houseParam.Area, 10, -1)
  391. packagePrice.BuildPrice.Design = utils.FloatMul(houseParam.Area, pkgInfo.DesignFee, 4)
  392. 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)
  393. packagePrice.BuildPrice.TotalCost = utils.FloatMul(pkgInfo.PackageRate, packagePrice.BuildPrice.Total, 4)
  394. // 套餐补贴成本
  395. //packagePrice.CostExtra = CalcPackageCostExtra(calcSetting)
  396. packagePrice.CostExtra = utils.FloatAddSlice([]float64{2000, utils.FloatMul(12, houseParam.Area, 4)}, 4)
  397. // 完工补贴
  398. packagePrice.FinishExtra = 500 + 1500 + 350
  399. // 套餐总报价
  400. packagePrice.Cost = utils.FloatAddSlice([]float64{packagePrice.BuildPrice.TotalCost, packagePrice.Material, packagePrice.CostExtra, packagePrice.FinishExtra}, -1)
  401. packagePrice.Total = utils.FloatDiv(packagePrice.Cost, utils.FloatSub(1, pkgInfo.ProfitRate, -1), -1)
  402. if form.Area > 100 {
  403. packagePrice.Total = utils.FloatDiv(packagePrice.Total, pkgInfo.DiscountRate100, 4)
  404. } else {
  405. packagePrice.Total = utils.FloatDiv(packagePrice.Total, pkgInfo.DiscountRate, 4)
  406. }
  407. toiletPrice.BuildPrice.Total = toiletPrice.BuildPrice.Direct
  408. toiletPrice.BuildPrice.TotalCost = utils.FloatMul(pkgInfo.PackageRate, toiletPrice.BuildPrice.Total, 4)
  409. toiletPrice.BuildPrice.TotalCost = utils.FloatMul(1.15, toiletPrice.BuildPrice.TotalCost, 4)
  410. toiletPrice.CostExtra = 0
  411. toiletPrice.FinishExtra = 0
  412. toiletPrice.Cost = utils.FloatAddSlice([]float64{toiletPrice.BuildPrice.TotalCost, toiletPrice.Material, toiletPrice.CostExtra, toiletPrice.FinishExtra}, -1)
  413. toiletPrice.Total = utils.FloatDiv(toiletPrice.Cost, utils.FloatSub(1, pkgInfo.ToiletRate, -1), -1)
  414. //fmt.Println("总面积:"+ utils.ToStr(houseParam.Area))
  415. //fmt.Println("套餐内施工直接费:"+ utils.ToStr(packagePrice.BuildPrice.Direct))
  416. //fmt.Println("套餐内施工制图费:"+ utils.ToStr(packagePrice.BuildPrice.Design))
  417. //fmt.Println("套餐内施工搬运费:"+ utils.ToStr(packagePrice.BuildPrice.Transport))
  418. //fmt.Println("套餐内施工卫生费:"+ utils.ToStr(packagePrice.BuildPrice.Sanitation))
  419. //fmt.Println("套餐内施工管理费:"+ utils.ToStr(packagePrice.BuildPrice.Manage))
  420. //fmt.Println("套餐内水泥补贴:"+ utils.ToStr(packagePrice.BuildPrice.CementExtra))
  421. //fmt.Println("套餐内施工总价:"+ utils.ToStr(packagePrice.BuildPrice.Total))
  422. //fmt.Println("套餐内施工成本:"+ utils.ToStr(packagePrice.BuildPrice.TotalCost))
  423. //fmt.Println("套餐内主材成本:"+ utils.ToStr(packagePrice.Material))
  424. //fmt.Println("套餐内补贴成本:"+ utils.ToStr(packagePrice.CostExtra))
  425. //fmt.Println("套餐内完工补贴:"+ utils.ToStr(packagePrice.FinishExtra))
  426. //fmt.Println("套餐内总报价:"+ utils.ToStr(packagePrice.Total)+"(施工成本+主材成本+补贴成本+完工补贴)/ "+utils.ToStr(1-pkgInfo.ProfitRate)+")/ 0.88")
  427. // 个性化
  428. var customizePrice calc.CustomizePrice
  429. for category, items := range form.Customize {
  430. money := float64(0)
  431. for k, v := range items {
  432. if v.Num <= 0 {
  433. continue
  434. }
  435. bidItem := bidMap[v.ID]
  436. if bidItem != nil {
  437. price := CalcBidCustomizeMoney(v.Num, bidItem)
  438. money = utils.FloatAdd(money, price, 4)
  439. v.Total = price
  440. items[k] = v
  441. }
  442. }
  443. switch category {
  444. case 3:
  445. customizePrice.BuildPrice.Direct = money
  446. case 4:
  447. customizePrice.MaterialAdd = money
  448. case 5:
  449. customizePrice.MaterialDel = 0 - money
  450. case 6:
  451. customizePrice.MaterialUpgrade = money
  452. case 11:
  453. customizePrice.Design = money
  454. }
  455. }
  456. //customizePrice.BuildPrice.Transport = utils.FloatMul(customizePrice.BuildPrice.Direct, pkgInfo.TransportRate, 4)
  457. //customizePrice.BuildPrice.Sanitation= utils.FloatMul(customizePrice.BuildPrice.Direct, pkgInfo.SanitationRate, 4)
  458. //customizePrice.BuildPrice.Manage = utils.FloatMul(utils.FloatAddSlice([]float64{customizePrice.BuildPrice.Direct, customizePrice.BuildPrice.Transport, customizePrice.BuildPrice.Sanitation}, -1), pkgInfo.ManageRate, 4)
  459. //customizePrice.BuildPrice.Total = utils.FloatAddSlice([]float64{customizePrice.BuildPrice.Direct, customizePrice.BuildPrice.Manage,customizePrice.BuildPrice.Sanitation, customizePrice.BuildPrice.Transport}, 4)
  460. customizePrice.BuildPrice.Total = customizePrice.BuildPrice.Direct
  461. customizePrice.Build = customizePrice.BuildPrice.Total
  462. customizePriceRate := utils.FloatAddSlice([]float64{customizePrice.BuildPrice.Direct, customizePrice.MaterialAdd, customizePrice.MaterialUpgrade}, -1)
  463. customizePrice.Transport = utils.FloatMul(customizePriceRate, transportRate, 4)
  464. customizePrice.Sanitation = utils.FloatMul(customizePriceRate, transportRate, 4)
  465. customizePrice.Manage = utils.FloatMul(utils.FloatAddSlice([]float64{customizePriceRate, customizePrice.Transport, customizePrice.Sanitation}, -1), pkgInfo.ManageRate, 4)
  466. customizePrice.Total = utils.FloatAddSlice([]float64{customizePrice.MaterialAdd, customizePrice.MaterialDel, customizePrice.MaterialUpgrade, customizePrice.Build, customizePrice.Design}, -1)
  467. customizePrice.Total = utils.FloatAddSlice([]float64{customizePrice.Total, customizePrice.Transport, customizePrice.Sanitation, customizePrice.Manage}, 4)
  468. 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)
  469. //fmt.Println("------------")
  470. //fmt.Println("个性化施工增项报价:"+ utils.ToStr(customizePrice.Build))
  471. //fmt.Println("个性化主材增项报价:"+ utils.ToStr(customizePrice.MaterialAdd))
  472. //fmt.Println("个性化主材减项报价:"+ utils.ToStr(customizePrice.MaterialDel))
  473. //fmt.Println("个性化主材升级报价:"+ utils.ToStr(customizePrice.MaterialUpgrade))
  474. //fmt.Println("个性化设计费:"+ utils.ToStr(customizePrice.Design))
  475. //fmt.Println("个性化总报价:"+ utils.ToStr(customizePrice.Total))
  476. //fmt.Println("------------")
  477. //fmt.Println("定制品:"+ utils.ToStr(inclusivePrice.Diy))
  478. //fmt.Println("家具:"+ utils.ToStr(inclusivePrice.Furniture))
  479. //fmt.Println("灯具:"+ utils.ToStr(inclusivePrice.Lamp))
  480. //fmt.Println("窗帘:"+ utils.ToStr(inclusivePrice.Curtain))
  481. if true || form.IsInclusive == 1 {
  482. inclusivePrice.Total = utils.FloatAddSlice([]float64{inclusivePrice.Diy, inclusivePrice.Furniture, inclusivePrice.Lamp, inclusivePrice.Curtain}, -1)
  483. inclusiveCost.Total = utils.FloatAddSlice([]float64{inclusiveCost.Diy, inclusiveCost.Furniture, inclusiveCost.Lamp, inclusiveCost.Curtain, inclusiveCost.Prize, inclusiveCost.Deposit, inclusiveCost.Appliances}, -1)
  484. } else {
  485. inclusivePrice.Total = 0
  486. inclusiveCost.Total = 0
  487. }
  488. //fmt.Println("定制品总金额:"+ utils.ToStr(inclusivePrice.Total))
  489. //fmt.Println("------------")
  490. money := utils.FloatAddSlice([]float64{packagePrice.Total, customizePrice.Total, inclusivePrice.Total, toiletPrice.Total}, 0)
  491. //fmt.Println("总报价:"+ utils.ToStr(money))
  492. //fmt.Println("------------")
  493. baseDiscount := utils.FloatDiv(utils.FloatSub(utils.FloatAdd(packagePrice.Total, inclusivePrice.Total, -1), inclusiveCost.Total, -1), packagePrice.Total, -1)
  494. if baseDiscount < pkgInfo.MinDiscount {
  495. //total := utils.FloatSub(inclusiveCost.Total, utils.FloatMul(utils.FloatSub(1, pkgInfo.MinDiscount, -1), packagePrice.Total, -1), -1)
  496. //inclusivePrice.Discount = utils.FloatSub(total, inclusivePrice.Total, -1)
  497. //inclusivePrice.Total = total
  498. baseDiscount = pkgInfo.MinDiscount
  499. money = utils.FloatAddSlice([]float64{packagePrice.Total, customizePrice.Total, inclusivePrice.Total}, 0)
  500. }
  501. baseInterestRate := utils.FloatSub(1, utils.FloatDiv(packagePrice.Cost, utils.FloatSub(utils.FloatAdd(packagePrice.Total, inclusivePrice.Total, -1), inclusiveCost.Total, -1), -1), -1)
  502. 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)
  503. if form.PkgID == 45 || form.PkgID == 50 {
  504. if form.Area == 80 {
  505. 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 {
  506. money = 99980
  507. }
  508. }
  509. }
  510. if form.PkgID == 48 {
  511. if form.Area == 100 {
  512. 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 {
  513. money = 99980
  514. }
  515. }
  516. }
  517. if form.PkgID == 47 {
  518. if form.Area == 100 {
  519. 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 {
  520. money = 121800
  521. }
  522. }
  523. }
  524. return calc.PriceReturn{
  525. PackagePrice: packagePrice.Total,
  526. PackagePriceDetail: utils.JsonEncode(packagePrice),
  527. CustomizePrice: customizePrice.Total,
  528. CustomizePriceDetail: utils.JsonEncode(customizePrice),
  529. InclusivePrice: inclusivePrice.Total,
  530. InclusivePriceDetail: utils.JsonEncode(inclusivePrice),
  531. InclusiveCost: inclusiveCost.Total,
  532. InclusiveCostDetail: utils.JsonEncode(inclusiveCost),
  533. ToiletPrice: toiletPrice.Total,
  534. ToiletPriceDetail: utils.JsonEncode(toiletPrice),
  535. BaseDiscount: baseDiscount,
  536. BaseInterestRate: baseInterestRate,
  537. InterestRate: interestRate,
  538. HouseArea: houseParam.Area,
  539. TotalPrice: money,
  540. Customize: utils.JsonEncode(form.Customize),
  541. Param: utils.JsonEncode(form.Param),
  542. TransportRate: transportRate,
  543. IsElevator: form.IsElevator,
  544. FloorNum: form.FloorNum,
  545. }, nil
  546. }
  547. func getOrderMap(f form.MaterialBidOrderAdd) (map[string]interface{}, error) {
  548. res, err := Calc(form.MaterialBidDetailCalc{
  549. PkgID: f.PkgID,
  550. Type: f.Type,
  551. Area: f.Area,
  552. Param: f.Param,
  553. HouseStyle: f.HouseStyle,
  554. Customize: f.Customize,
  555. IsElevator: f.IsElevator,
  556. InclusiveArea: f.InclusiveArea,
  557. FloorNum: f.FloorNum,
  558. })
  559. if err != nil {
  560. return nil, err
  561. }
  562. orderMap := map[string]interface{}{
  563. "pkg_id": f.PkgID,
  564. "type": f.Type,
  565. "customer_name": f.CustomerName,
  566. "customer_phone": f.CustomerPhone,
  567. "house_address": f.HouseAddress,
  568. "house_area": res.HouseArea,
  569. "house_style": utils.JsonEncode(f.HouseStyle),
  570. "param": res.Param,
  571. "customize": res.Customize,
  572. "user_id": user.CreateNewUser(f.CustomerName, f.CustomerPhone),
  573. "package_price": res.PackagePrice,
  574. "package_price_detail": res.PackagePriceDetail,
  575. "customize_price": res.CustomizePrice,
  576. "customize_price_detail": res.CustomizePriceDetail,
  577. "inclusive_price": res.InclusivePrice,
  578. "inclusive_price_detail": res.InclusivePriceDetail,
  579. "inclusive_cost": res.InclusiveCost,
  580. "inclusive_cost_detail": res.InclusiveCostDetail,
  581. "toilet_price": res.ToiletPrice,
  582. "toilet_price_detail": res.ToiletPriceDetail,
  583. "total_price": res.TotalPrice,
  584. "base_discount": res.BaseDiscount,
  585. "base_interest_rate": res.BaseInterestRate,
  586. "interest_rate": res.InterestRate,
  587. "profit_rate": res.ProfitRate,
  588. "is_elevator": res.IsElevator,
  589. "floor_num": res.FloorNum,
  590. "inclusive_area": f.InclusiveArea,
  591. "transport_rate": res.TransportRate,
  592. }
  593. return orderMap, nil
  594. }
  595. func EditOrder(f form.MaterialBidOrderAdd, id int) (int64, error) {
  596. orderMap, err := getOrderMap(f)
  597. if err != nil {
  598. return 0, err
  599. }
  600. return db.Update(MatBidOrder.TableName(), map[string]interface{}{"id": id}, orderMap)
  601. }
  602. func UpdateOrder(id int) (int64, error) {
  603. var orderInfo structs.MaterialBidOrderList
  604. if _, err := GetOrder(map[string]interface{}{"id": id}, nil, &orderInfo); err != nil {
  605. return 0, err
  606. }
  607. var houseStyle []structs.HouseStyle
  608. utils.JsonDecode(orderInfo.HouseStyle).To(&houseStyle)
  609. utils.JsonDecode(orderInfo.Param).To(&orderInfo.ParamDecode)
  610. utils.JsonDecode(orderInfo.Customize).To(&orderInfo.CustomizeDecode)
  611. orderInfo.ParamDecode = orderInfo.ParamDecode[:len(orderInfo.ParamDecode)-1]
  612. addForm := form.MaterialBidOrderAdd{
  613. PkgID: orderInfo.PkgID,
  614. AdminID: orderInfo.AdminID,
  615. CustomerPhone: orderInfo.CustomerPhone,
  616. CustomerName: orderInfo.CustomerName,
  617. HouseStyle: houseStyle,
  618. HouseAddress: orderInfo.HouseAddress,
  619. Param: orderInfo.ParamDecode,
  620. Customize: orderInfo.CustomizeDecode,
  621. }
  622. return EditOrder(addForm, id)
  623. }
  624. func AddOrder(f form.MaterialBidOrderAdd) (int64, error) {
  625. orderMap, err := getOrderMap(f)
  626. if err != nil {
  627. return 0, err
  628. }
  629. orderMap["admin_id"] = f.AdminID
  630. return db.InsertOne(MatBidOrder.TableName(), orderMap)
  631. }
  632. func RemarkOrder(form form.OrderRemark, id int) error {
  633. db.Update(MatBidOrder.TableName(), map[string]interface{}{"id": id}, map[string]interface{}{"remarks": form.Content})
  634. return nil
  635. }
  636. func FinishOrder(id int) error {
  637. _, err := db.Update(MatBidOrder.TableName(), map[string]interface{}{"id": id}, map[string]interface{}{"state": bidParam.OrderState.Finished})
  638. return err
  639. }
  640. func DelOrder(id int) error {
  641. _, err := db.DeleteSoft(MatBidOrder.TableName(), map[string]interface{}{"id": id})
  642. return err
  643. }