final.go 64 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168
  1. package admin
  2. import (
  3. "fmt"
  4. "math"
  5. "os"
  6. "strconv"
  7. "strings"
  8. "sync/atomic"
  9. "time"
  10. "zhiyuan/models"
  11. "zhiyuan/models/budget2"
  12. "zhiyuan/models/final"
  13. "zhiyuan/pkg/app"
  14. "zhiyuan/pkg/config"
  15. "zhiyuan/pkg/db"
  16. "zhiyuan/pkg/logger"
  17. "zhiyuan/pkg/utils"
  18. "zhiyuan/services/structs"
  19. "zhiyuan/services/user"
  20. "github.com/Knetic/govaluate"
  21. "github.com/gin-gonic/gin"
  22. "github.com/tealeg/xlsx/v3"
  23. "github.com/w3liu/go-common/constant/timeformat"
  24. "github.com/xuri/excelize/v2"
  25. )
  26. func statistQuery(post map[string]interface{}) (db.Select, []final.FinalType, []final.FinalMatAuxiliary, []map[string]interface{}) {
  27. finaltypes := make([]final.FinalType, 0)
  28. db.GetModel(map[string]interface{}{
  29. "state": 1,
  30. "deleted_at": 0,
  31. }, &finaltypes)
  32. auxiliarytypes := make([]final.FinalMatAuxiliary, 0)
  33. db.GetModel(map[string]interface{}{
  34. "type": 0,
  35. "deleted_at": 0,
  36. }, &auxiliarytypes)
  37. mattypes := map[string][]string{
  38. "瓷砖": {"东鹏瓷砖", "马可波罗", "新恒隆瓷砖", "冠珠陶瓷"},
  39. "地板": {"圣象地板", "剑牌地板", "富林地板", "大自然地板", "生活家地板"},
  40. "木门": {"欧铂尼木门", "TATA木门", "福和美木门"},
  41. "橱柜": {"欧派橱柜", "德莎橱柜", "阳光木业"},
  42. "卫浴": {"彪马卫浴", "箭牌卫浴", "安华卫浴", "雪雨卫浴"},
  43. "铝合金门": {"铂兰西尼", "鑫兴门业"},
  44. "开关面板": {"伊诺开关", "西门子"},
  45. "石材": {"诚明石材"},
  46. "衣柜": {"爱逸德家居", "谛凡衣柜"},
  47. "扣板": {"邻邦扣板"},
  48. "淋浴隔断": {"德亦淋浴房"},
  49. "灯具": {"鑫盛灯饰"},
  50. "窗帘": {"鸟巢", "布蓝德"},
  51. "家具": {"全友", "喜临门"},
  52. "电器": {"海尔", "美的", "方太"},
  53. }
  54. s := db.ModelQuery(db.Type(final.FinalSite{}), post, false)
  55. tableTableName := "(select `table`.`site_id` as `site_id`, "
  56. controlTableName := "(select `control`.`site_id` as `site_id`, "
  57. for _, t := range finaltypes {
  58. controlTableName += fmt.Sprintf("ifnull(sum(if(`control`.`type_id` = %s,`control`.`budget`,0)),0) as `budget_%s`, ", db.ToString(t.ID), db.ToString(t.ID))
  59. s.Select["table_budget_"+db.ToString(t.ID)] = fmt.Sprintf("`control`.`budget_%s`", db.ToString(t.ID))
  60. if t.LivingCount != 0 {
  61. tableTableName += fmt.Sprintf("ifnull(sum(if(`table`.`type_id` = %s and `table`.`type` = 0,`table`.`total`,0)),0) as `total_0_%s`, ", db.ToString(t.ID), db.ToString(t.ID))
  62. tableTableName += fmt.Sprintf("ifnull(sum(if(`table`.`type_id` = %s and `table`.`type` = 1,`table`.`total`,0)),0) as `total_1_%s`, ", db.ToString(t.ID), db.ToString(t.ID))
  63. tableTableName += fmt.Sprintf("ifnull(group_concat(distinct if(`table`.`type_id` = %s and `table`.`type` = 0,`table`.`state`,null)),\"\") as `state_0_%s`, ", db.ToString(t.ID), db.ToString(t.ID))
  64. tableTableName += fmt.Sprintf("ifnull(group_concat(distinct if(`table`.`type_id` = %s and `table`.`type` = 1,`table`.`state`,null)),\"\") as `state_1_%s`, ", db.ToString(t.ID), db.ToString(t.ID))
  65. s.Select["table_total_0_"+db.ToString(t.ID)] = fmt.Sprintf("`table`.`total_0_%s`", db.ToString(t.ID))
  66. s.Select["table_total_1_"+db.ToString(t.ID)] = fmt.Sprintf("`table`.`total_1_%s`", db.ToString(t.ID))
  67. s.Select["table_state_0_"+db.ToString(t.ID)] = fmt.Sprintf("`table`.`state_0_%s`", db.ToString(t.ID))
  68. s.Select["table_state_1_"+db.ToString(t.ID)] = fmt.Sprintf("`table`.`state_1_%s`", db.ToString(t.ID))
  69. }
  70. tableTableName += fmt.Sprintf("ifnull(sum(if(`table`.`type_id` = %s,`table`.`total`,0)),0) as `total_%s`, ", db.ToString(t.ID), db.ToString(t.ID))
  71. tableTableName += fmt.Sprintf("ifnull(group_concat(distinct if(`table`.`type_id` = %s,`table`.`state`,null)),\"\") as `state_%s`, ", db.ToString(t.ID), db.ToString(t.ID))
  72. s.Select["table_total_"+db.ToString(t.ID)] = fmt.Sprintf("`table`.`total_%s`", db.ToString(t.ID))
  73. s.Select["table_state_"+db.ToString(t.ID)] = fmt.Sprintf("`table`.`state_%s`", db.ToString(t.ID))
  74. /*s.Select["table_total_"+db.ToString(t.ID)] = "ROUND(sum(distinct(IF(`table`.`type_id`=" + db.ToString(t.ID) + ",`item`.`price`*`item`.`num`,null))))"
  75. s.Select["table_state_"+db.ToString(t.ID)] = "ROUND(sum(distinct(IF(`table`.`type_id`=" + db.ToString(t.ID) + ",`table`.`state`,null))))"*/
  76. }
  77. tableTableName += "ifnull(sum(`table`.`total`),0) as `total` from `zy_final_site_table` as `table` where `table`.`deleted_at` = 0 and `table`.`state` != -1 group by `table`.`site_id`)"
  78. controlTableName += "ifnull(sum(`control`.`budget`),0) as `budget` from `zy_final_site_control` as `control` where `control`.`deleted_at` = 0 group by `control`.`site_id`)"
  79. orderTableName := "(select `order`.`site_id` as `site_id`, "
  80. materialTableName := "(select `material`.`site_id` as `site_id`, "
  81. for _, t := range auxiliarytypes {
  82. materialTableName += fmt.Sprintf("ifnull(sum(if(`material`.`type_id` = %s,`material`.`budget`,0)),0) as `budget_%s`, ", db.ToString(t.ID), db.ToString(t.ID))
  83. s.Select["material_budget_"+db.ToString(t.ID)] = fmt.Sprintf("`material`.`budget_%s`", db.ToString(t.ID))
  84. orderTableName += fmt.Sprintf("ifnull(sum(if(`material`.`type_id` = %s,`order`.`total`,0)),0) as `total_%s`, ", db.ToString(t.ID), db.ToString(t.ID))
  85. orderTableName += fmt.Sprintf("ifnull(group_concat(distinct if(`material`.`type_id` = %s,`supplier`.`name`,null)),\"\") as `supplier_%s`, ", db.ToString(t.ID), db.ToString(t.ID))
  86. orderTableName += fmt.Sprintf("ifnull(group_concat(distinct if(`material`.`type_id` = %s,`order`.`state`,null)),\"\") as `state_%s`, ", db.ToString(t.ID), db.ToString(t.ID))
  87. s.Select["order_total_"+db.ToString(t.ID)] = fmt.Sprintf("`order`.`total_%s`", db.ToString(t.ID))
  88. s.Select["order_supplier_"+db.ToString(t.ID)] = fmt.Sprintf("`order`.`supplier_%s`", db.ToString(t.ID))
  89. s.Select["order_state_"+db.ToString(t.ID)] = fmt.Sprintf("`order`.`state_%s`", db.ToString(t.ID))
  90. }
  91. matTypes := make([]map[string]interface{}, 0)
  92. for name, suppliers := range mattypes {
  93. id := len(matTypes)
  94. orderTableName += fmt.Sprintf("ifnull(sum(if(`supplier`.`name` in %s,`order`.`total`,0)),0) as `stotal_%s`, ", s.Param(suppliers), db.ToString(id))
  95. orderTableName += fmt.Sprintf("ifnull(group_concat(distinct if(`supplier`.`name` in %s,`supplier`.`name`,null)),\"\") as `ssupplier_%s`, ", s.Param(suppliers), db.ToString(id))
  96. orderTableName += fmt.Sprintf("ifnull(group_concat(distinct if(`supplier`.`name` in %s,`order`.`state`,null)),\"\") as `sstate_%s`, ", s.Param(suppliers), db.ToString(id))
  97. s.Select["order_stotal_"+db.ToString(id)] = fmt.Sprintf("`order`.`stotal_%s`", db.ToString(id))
  98. s.Select["order_ssupplier_"+db.ToString(id)] = fmt.Sprintf("`order`.`ssupplier_%s`", db.ToString(id))
  99. s.Select["order_sstate_"+db.ToString(id)] = fmt.Sprintf("`order`.`sstate_%s`", db.ToString(id))
  100. matTypes = append(matTypes, map[string]interface{}{
  101. "id": id,
  102. "name": name,
  103. })
  104. }
  105. orderTableName += "ifnull(sum(`order`.`total`),0) as `total` from `zy_final_material_order` as `order` left join `zy_final_material` as `material` on `material`.`id` = `order`.`type_id` left join `zy_final_supplier` as `supplier` on `supplier`.`id` = `order`.`supplier_id` where `order`.`deleted_at` = 0 and `order`.`state` != -1 group by `order`.`site_id`)"
  106. materialTableName += "ifnull(sum(`material`.`budget`),0) as `budget` from `zy_final_material` as `material` where `material`.`deleted_at` = 0 group by `material`.`site_id`)"
  107. /*materialTableName := "(select `order`.`site_id` as `site_id`, ifnull(sum(if(`order`.`type` = 0 and `order`.`state` != -1,`order`.`total`,0)),0) as `total_0`, ifnull(sum(if(`order`.`type` = 1 and `order`.`state` != -1,`order`.`total`,0)),0) as `total_1`, ifnull(sum(if(`order`.`state` != -1,`order`.`total`,0)),0) as `total`, ifnull(sum(`process`.`count`),0) as `process_count`, ifnull(sum(`process`.`count_6`),0) as `process_count_6`, ifnull(sum(`process`.`count_7`),0) as `process_count_7` from `zy_final_material_order` as `order` left join (select `process`.`order_id`, ifnull(count(`process`.`id`),0) as `count`, ifnull(count(if(`process`.`type` = 6,`process`.`id`,null)),0) as `count_6`, ifnull(count(if(`process`.`type` = 7,`process`.`id`,null)),0) as `count_7` from `zy_final_material_order_process` as `process` where `process`.`deleted_at` = 0 and ((`process`.`type` = 6 and `process`.`check` = 0 and `process`.`check2` = 0 and `process`.`check3` = 0) or (`process`.`type` = 7 and `process`.`check` = 0)) group by `process`.`order_id`) as `process` on `process`.`order_id` = `order`.`id` where `order`.`deleted_at` = 0 group by `order`.`site_id`)"
  108. s.Select["material_total_0"] = "`material`.`total_0`"
  109. s.Select["material_total_1"] = "`material`.`total_1`"
  110. s.Select["material_total"] = "`material`.`total`"
  111. s.Select["material_process_count"] = "`material`.`process_count`"
  112. s.Select["material_process_count_6"] = "`material`.`process_count_6`"
  113. s.Select["material_process_count_7"] = "`material`.`process_count_7`"*/
  114. paymentTableName := "(select `payment`.`site_id` as `site_id`, group_concat(`type`.`name`) as `name`, group_concat(`type`.`id`) as `id` from `zy_final_site_payment` as `payment` left join `zy_final_payment_type` as `type` on `type`.`id` = `payment`.`type_id` where `payment`.`deleted_at` = 0 and `payment`.`state` = 1 group by `payment`.`site_id`)"
  115. s.Select["payment_name"] = "`payment`.`name`"
  116. s.Select["payment_id"] = "`payment`.`id`"
  117. s.Select["manager_price"] = "sum(`managerprice`.`price`)"
  118. s.Select["settle_total"] = "settle.total"
  119. s.Select["settle_state"] = "settle.state"
  120. s.Select["shop_name"] = "shop.shop_name"
  121. s.Select["manager_name"] = "manager.username"
  122. s.Select["project_leader_name"] = "project_leader.username"
  123. s.Select["designer_name"] = "designer.username"
  124. s.LeftJoin = []db.Join{
  125. {
  126. TableName: tableTableName,
  127. As: "table",
  128. On: []string{
  129. "`table`.`site_id` = " + final.FinalSite{}.TableName() + ".`id`",
  130. },
  131. },
  132. {
  133. TableName: controlTableName,
  134. As: "control",
  135. On: []string{
  136. "`control`.`site_id` = " + final.FinalSite{}.TableName() + ".`id`",
  137. },
  138. },
  139. {
  140. TableName: orderTableName,
  141. As: "order",
  142. On: []string{
  143. "`order`.`site_id` = " + final.FinalSite{}.TableName() + ".`id`",
  144. },
  145. },
  146. {
  147. TableName: materialTableName,
  148. As: "material",
  149. On: []string{
  150. "`material`.`site_id` = " + final.FinalSite{}.TableName() + ".`id`",
  151. },
  152. },
  153. {
  154. TableName: paymentTableName,
  155. As: "payment",
  156. On: []string{
  157. "`payment`.`site_id` = " + final.FinalSite{}.TableName() + ".`id`",
  158. },
  159. },
  160. {
  161. TableName: final.FinalManagerPrice{}.TableName(),
  162. As: "managerprice",
  163. On: []string{
  164. "`managerprice`.`deleted_at` = 0",
  165. "`managerprice`.`site_id` = " + final.FinalSite{}.TableName() + ".`id`",
  166. },
  167. },
  168. {
  169. TableName: final.FinalSettle{}.TableName(),
  170. As: "settle",
  171. On: []string{
  172. "`settle`.`deleted_at` = 0",
  173. "`settle`.`site_id` = " + final.FinalSite{}.TableName() + ".`id`",
  174. },
  175. },
  176. {
  177. TableName: final.JoinShop{}.TableName(),
  178. As: "shop",
  179. On: []string{
  180. "`shop`.`id` = " + final.FinalSite{}.TableName() + ".`shop_id`",
  181. },
  182. },
  183. {
  184. TableName: final.JoinAdmin{}.TableName(),
  185. As: "manager",
  186. On: []string{
  187. "`manager`.`id` = " + final.FinalSite{}.TableName() + ".`manager_id`",
  188. },
  189. },
  190. {
  191. TableName: final.JoinAdmin{}.TableName(),
  192. As: "project_leader",
  193. On: []string{
  194. "`project_leader`.`id` = " + final.FinalSite{}.TableName() + ".`project_leader_id`",
  195. },
  196. },
  197. {
  198. TableName: final.JoinAdmin{}.TableName(),
  199. As: "designer",
  200. On: []string{
  201. "`designer`.`id` = " + final.FinalSite{}.TableName() + ".`designer_id`",
  202. },
  203. },
  204. }
  205. s.GroupBy = final.FinalSite{}.TableName() + ".`id`"
  206. if starttime1s, ok := post["starttime1"]; ok {
  207. if starttime1, ok := db.ToInt64(starttime1s); ok {
  208. s.Where = append(s.Where, fmt.Sprintf("`%s`.`starttime` >= %s", final.FinalSite{}.TableName(), s.Param(starttime1)))
  209. }
  210. }
  211. if starttime2s, ok := post["starttime2"]; ok {
  212. if starttime2, ok := db.ToInt64(starttime2s); ok {
  213. s.Where = append(s.Where, fmt.Sprintf("`%s`.`starttime` < %s", final.FinalSite{}.TableName(), s.Param(starttime2+60*60*24)))
  214. }
  215. }
  216. if payment_id, ok := post["payment_id"]; ok {
  217. if payment_id, ok := db.ToInt64(payment_id); ok {
  218. s.Where = append(s.Where, fmt.Sprintf("FIND_IN_SET(%s, `payment`.`id`)", s.Param(payment_id)))
  219. }
  220. }
  221. return s, finaltypes, auxiliarytypes, matTypes
  222. }
  223. func FinalStatist(c *gin.Context) {
  224. var post map[string]interface{}
  225. if err := c.ShouldBindJSON(&post); err != nil {
  226. }
  227. s, finaltypes, auxiliarytypes, matTypes := statistQuery(post)
  228. query, params := s.Query()
  229. list, err := db.QueryMap(query, params, models.Daily{}.DB())
  230. if err != nil {
  231. app.ErrorMsg(c, err.Error(), nil)
  232. return
  233. }
  234. if list == nil {
  235. list = make([]map[string]interface{}, 0)
  236. }
  237. data := gin.H{
  238. "types": finaltypes,
  239. "auxiliarytypes": auxiliarytypes,
  240. "mattypes": matTypes,
  241. "list": list,
  242. }
  243. count, err := db.GetCount(s, models.Daily{}.DB())
  244. if err != nil {
  245. app.ErrorMsg(c, err.Error(), nil)
  246. return
  247. }
  248. data["count"] = count
  249. app.Success(c, data)
  250. }
  251. func tableState(s string) string {
  252. states := []string{"未提交", "工程队长审核", "财务审核", "店长审核", "财务付款", "已完成"}
  253. rets := make([]string, 0)
  254. for _, ss := range strings.Split(s, ",") {
  255. if ss != "" {
  256. sss, _ := db.ToInt64(ss)
  257. if len(states) > int(sss) {
  258. rets = append(rets, states[sss])
  259. }
  260. }
  261. }
  262. return strings.Join(rets, ",")
  263. }
  264. func materialState(s string) string {
  265. states := []string{"待备货", "已备货", "待配送", "待收货", "已收货", "待安装", "待验收", "已完成", "已下单", "待测量", "待审核"}
  266. rets := make([]string, 0)
  267. for _, ss := range strings.Split(s, ",") {
  268. if ss != "" {
  269. sss, _ := db.ToInt64(ss)
  270. if len(states) > int(sss) {
  271. rets = append(rets, states[sss])
  272. }
  273. }
  274. }
  275. return strings.Join(rets, ",")
  276. }
  277. func FinalStatistExport(c *gin.Context) {
  278. var post map[string]interface{}
  279. if err := c.ShouldBindJSON(&post); err != nil {
  280. }
  281. s, finaltypes, auxiliarytypes, matTypes := statistQuery(post)
  282. query, params := s.Query()
  283. list, err := db.QueryMap(query, params, models.Daily{}.DB())
  284. if err != nil {
  285. app.ErrorMsg(c, err.Error(), nil)
  286. return
  287. }
  288. if list == nil {
  289. list = make([]map[string]interface{}, 0)
  290. }
  291. export := excelize.NewFile()
  292. header := []string{"ID", "业主姓名", "手机号码", "工地", "门店", "项目经理", "工程队长", "设计师", "到款", "承包额"}
  293. for _, t := range finaltypes {
  294. header = append(header, t.Name+" 控额")
  295. if t.LivingCount != 0 {
  296. header = append(header, t.Name+" 费用")
  297. header = append(header, t.Name+" 费用状态")
  298. header = append(header, t.Name+" 结算")
  299. header = append(header, t.Name+" 结算状态")
  300. } else {
  301. header = append(header, t.Name+" 状态")
  302. }
  303. header = append(header, t.Name+" 合计")
  304. }
  305. for _, t := range auxiliarytypes {
  306. header = append(header, t.Name+" 控额")
  307. header = append(header, t.Name+" 订单品牌")
  308. header = append(header, t.Name+" 订单状态")
  309. header = append(header, t.Name+" 订单金额")
  310. }
  311. for _, t := range matTypes {
  312. header = append(header, db.ToString(t["name"])+" 订单品牌")
  313. header = append(header, db.ToString(t["name"])+" 订单状态")
  314. header = append(header, db.ToString(t["name"])+" 订单金额")
  315. }
  316. for i, _ := range header {
  317. col, _ := excelize.ColumnNumberToName(i + 1)
  318. export.SetColWidth("Sheet1", col, col, 30)
  319. }
  320. export.SetSheetRow("Sheet1", "A1", &header)
  321. for i, v := range list {
  322. address := db.ToString(v["address"]) + " " + db.ToString(v["village"]) + " " + db.ToString(v["room_no"])
  323. area, _ := db.ToFloat64(v["area"])
  324. if area != 0 {
  325. address += " " + db.ToString(area) + "㎡"
  326. }
  327. row := []string{db.ToString(v["id"]), db.ToString(v["username"]), db.ToString(v["phone"]), address, db.ToString(v["shop_name"]), db.ToString(v["manager_name"]), db.ToString(v["project_leader_name"]), db.ToString(v["designer_name"]), db.ToString(v["payment_name"]), db.ToString(v["manager_price"])}
  328. for _, t := range finaltypes {
  329. row = append(row, db.ToString(v["table_budget_"+db.ToString(t.ID)]))
  330. if t.LivingCount != 0 {
  331. row = append(row, db.ToString(v["table_total_1_"+db.ToString(t.ID)]))
  332. row = append(row, tableState(db.ToString(v["table_state_1_"+db.ToString(t.ID)])))
  333. row = append(row, db.ToString(v["table_total_0_"+db.ToString(t.ID)]))
  334. row = append(row, tableState(db.ToString(v["table_state_0_"+db.ToString(t.ID)])))
  335. } else {
  336. row = append(row, tableState(db.ToString(v["table_state_"+db.ToString(t.ID)])))
  337. }
  338. row = append(row, db.ToString(v["table_total_"+db.ToString(t.ID)]))
  339. }
  340. for _, t := range auxiliarytypes {
  341. row = append(row, db.ToString(v["material_budget_"+db.ToString(t.ID)]))
  342. row = append(row, db.ToString(v["order_supplier_"+db.ToString(t.ID)]))
  343. row = append(row, materialState(db.ToString(v["order_state_"+db.ToString(t.ID)])))
  344. row = append(row, db.ToString(v["order_total_"+db.ToString(t.ID)]))
  345. }
  346. for _, t := range matTypes {
  347. row = append(row, db.ToString(v["order_ssupplier_"+db.ToString(t["id"])]))
  348. row = append(row, materialState(db.ToString(v["order_sstate_"+db.ToString(t["id"])])))
  349. row = append(row, db.ToString(v["order_stotal_"+db.ToString(t["id"])]))
  350. }
  351. export.SetSheetRow("Sheet1", "A"+strconv.Itoa(i+2), &row)
  352. }
  353. style, err := export.NewStyle(&excelize.Style{
  354. Alignment: &excelize.Alignment{
  355. Horizontal: "center",
  356. Vertical: "center",
  357. },
  358. })
  359. export.SetRowStyle("Sheet1", 1, len(list)+1, style)
  360. exportFileName := utils.ToStr(time.Now().UnixNano()) + ".xlsx"
  361. b, err := export.WriteToBuffer()
  362. if err != nil {
  363. app.ErrorMsg(c, "导出失败", nil)
  364. return
  365. }
  366. f, err := os.Create(config.Cfg.App.ExportPath + exportFileName)
  367. if err != nil {
  368. app.ErrorMsg(c, "导出失败", nil)
  369. return
  370. }
  371. defer f.Close()
  372. _, _ = b.WriteTo(f)
  373. app.Success(c, gin.H{"path": "export/" + exportFileName, "filename": exportFileName})
  374. }
  375. func FinalMatImport(c *gin.Context) {
  376. file, err := c.FormFile("file")
  377. if err != nil {
  378. app.Error(c, fmt.Sprintf("get form err: %s", err.Error()))
  379. return
  380. }
  381. fileExt := utils.FileExt(file.Filename)
  382. attachKey := utils.RandomStr() + fileExt
  383. file.Filename = "data/" + attachKey
  384. if err := c.SaveUploadedFile(file, file.Filename); err != nil {
  385. app.Error(c, fmt.Sprintf("上传文件失败%s", err.Error()))
  386. return
  387. }
  388. wb, err := xlsx.OpenFile(file.Filename)
  389. if err != nil {
  390. app.Error(c, err.Error())
  391. return
  392. }
  393. areaId, _ := db.ToInt64(c.PostForm("area_id"))
  394. if areaId <= 0 {
  395. app.ErrorMsg(c, "导入区域错误", nil)
  396. return
  397. }
  398. types := make([]final.FinalMatType, 0)
  399. db.GetModel(map[string]interface{}{
  400. "deleted_at": 0,
  401. }, &types)
  402. suppliers := make([]final.FinalSupplier, 0)
  403. db.GetModel(map[string]interface{}{
  404. "deleted_at": 0,
  405. }, &suppliers)
  406. supplierMap := make(map[string]int64)
  407. for _, s := range suppliers {
  408. supplierMap[s.Name] = s.ID
  409. }
  410. for _, sh := range wb.Sheet {
  411. //datas := make([]map[string]interface{}, 0)
  412. headers := make([]string, 0)
  413. err := sh.ForEachRow(func(r *xlsx.Row) error {
  414. if r.GetCoordinate() <= 0 {
  415. err := r.ForEachCell(func(c *xlsx.Cell) error {
  416. headers = append(headers, c.String())
  417. return nil
  418. })
  419. if err != nil {
  420. return err
  421. }
  422. } else {
  423. var data final.FinalMat
  424. for i, header := range headers {
  425. value := r.GetCell(i).String()
  426. switch header {
  427. case "品牌":
  428. data.Brand = value
  429. case "系列":
  430. data.Series = value
  431. case "型号":
  432. data.Model = value
  433. case "规格":
  434. data.Specs = value
  435. case "颜色":
  436. data.Color = value
  437. case "SKU":
  438. data.SKU = value
  439. case "类型":
  440. typs := strings.Split(value, "/")
  441. pid := int64(0)
  442. path := ""
  443. for _, t := range typs {
  444. if t == "" {
  445. continue
  446. }
  447. var ts final.FinalMatType
  448. for _, typ := range types {
  449. if typ.Name == t && typ.Pid == pid {
  450. ts = typ
  451. break
  452. }
  453. }
  454. if ts.ID == 0 {
  455. id, err := db.InsertModel(db.Type(ts), map[string]interface{}{
  456. "name": t,
  457. "pid": pid,
  458. "path": path + db.ToString(pid) + ",",
  459. })
  460. if err != nil {
  461. return err
  462. }
  463. ts.ID = id
  464. ts.Name = t
  465. ts.Pid = pid
  466. ts.Path = path + db.ToString(pid) + ","
  467. types = append(types, ts)
  468. }
  469. pid = ts.ID
  470. path = ts.Path
  471. }
  472. data.TypeId = pid
  473. case "材料商":
  474. data.SupplierId = supplierMap[value]
  475. case "供货价":
  476. data.Price, _ = db.ToFloat64(value)
  477. case "控价":
  478. if value == "" {
  479. data.ControlPrice = -1
  480. } else {
  481. data.ControlPrice, _ = db.ToFloat64(value)
  482. }
  483. case "销售价":
  484. if value == "" {
  485. data.SalesPrice = -1
  486. } else {
  487. data.SalesPrice, _ = db.ToFloat64(value)
  488. }
  489. case "代购价":
  490. if value == "" {
  491. data.PurchasePrice = -1
  492. } else {
  493. data.PurchasePrice, _ = db.ToFloat64(value)
  494. }
  495. default:
  496. }
  497. }
  498. if data.Brand == "" || data.Model == "" || data.SupplierId == 0 {
  499. return nil
  500. }
  501. var mat final.FinalMat
  502. db.GetModel(map[string]interface{}{
  503. "area_id": areaId,
  504. "brand": data.Brand,
  505. "series": data.Series,
  506. "model": data.Model,
  507. "specs": data.Specs,
  508. "color": data.Color,
  509. "deleted_at": 0,
  510. }, &mat)
  511. da := map[string]interface{}{
  512. "area_id": areaId,
  513. "brand": data.Brand,
  514. "series": data.Series,
  515. "model": data.Model,
  516. "specs": data.Specs,
  517. "color": data.Color,
  518. "type_id": data.TypeId,
  519. "supplier_id": data.SupplierId,
  520. "sku": data.SKU,
  521. }
  522. if mat.Price != data.Price || mat.ControlPrice != data.ControlPrice || mat.SalesPrice != data.SalesPrice || mat.PurchasePrice != data.PurchasePrice {
  523. da["price"] = data.Price
  524. da["control_price"] = data.ControlPrice
  525. da["sales_price"] = data.SalesPrice
  526. da["purchase_price"] = data.PurchasePrice
  527. //da["state"] = 0
  528. }
  529. if mat.ID == 0 {
  530. _, err := db.InsertModel(db.Type(final.FinalMat{}), da)
  531. if err != nil {
  532. return err
  533. }
  534. } else {
  535. err := db.UpdateModel(db.Type(mat), mat.ID, da)
  536. if err != nil {
  537. return err
  538. }
  539. }
  540. }
  541. return nil
  542. })
  543. if err != nil {
  544. app.Error(c, err.Error())
  545. return
  546. }
  547. //if len(datas) != 0 {
  548. // db.InsertModels(db.Type(final.FinalMat{}), datas)
  549. //}
  550. }
  551. app.Success(c, nil)
  552. }
  553. func FinalMatOrderStatist(c *gin.Context) {
  554. var post map[string]interface{}
  555. if err := c.ShouldBindJSON(&post); err != nil {
  556. //app.ErrorMsg(c, err.Error(), nil)
  557. //return
  558. }
  559. var s db.Select
  560. s.TableName = "`zy_final_material_order`"
  561. s.Select = map[string]string{
  562. "date": "UNIX_TIMESTAMP(CONCAT(from_unixtime(`zy_final_material_order`.`take_time`,'%Y-%m'), '-01'))",
  563. "supplier_id": "`zy_final_material_order`.`supplier_id`",
  564. "count": "COUNT(1)",
  565. "total": "SUM(`zy_final_material_order`.`total`)",
  566. }
  567. s.GroupBy = "UNIX_TIMESTAMP(CONCAT(from_unixtime(`zy_final_material_order`.`take_time`,'%Y-%m'), '-01')), `zy_final_material_order`.`supplier_id`"
  568. s.OrderBy = "UNIX_TIMESTAMP(CONCAT(from_unixtime(`zy_final_material_order`.`take_time`,'%Y-%m'), '-01')) DESC"
  569. /*s.LeftJoin = []db.Join{{
  570. TableName: "zy_final_supplier",
  571. As: "supplier",
  572. On: []string{"`supplier`.`id` = `zy_final_material_order`.`supplier_id`"},
  573. }}*/
  574. if date, ok := post["date"]; ok {
  575. if n, ok := db.ToInt64(date); ok {
  576. s.Where = append(s.Where, fmt.Sprintf("UNIX_TIMESTAMP(CONCAT(from_unixtime(`zy_final_material_order`.`take_time`,'%%Y-%%m'), '-01')) = %s", s.Param(n)))
  577. }
  578. }
  579. if startdate, ok := post["startdate"]; ok {
  580. if n, ok := db.ToInt64(startdate); ok {
  581. s.Where = append(s.Where, fmt.Sprintf("UNIX_TIMESTAMP(CONCAT(from_unixtime(`zy_final_material_order`.`take_time`,'%%Y-%%m'), '-01')) >= %s", s.Param(n)))
  582. }
  583. }
  584. if enddate, ok := post["enddate"]; ok {
  585. if n, ok := db.ToInt64(enddate); ok {
  586. s.Where = append(s.Where, fmt.Sprintf("UNIX_TIMESTAMP(CONCAT(from_unixtime(`zy_final_material_order`.`take_time`,'%%Y-%%m'), '-01')) <= %s", s.Param(n)))
  587. }
  588. }
  589. if supplier_id, ok := post["supplier_id"]; ok {
  590. if n, ok := db.ToInt64(supplier_id); ok {
  591. s.Where = append(s.Where, fmt.Sprintf("`zy_final_material_order`.`supplier_id` = %s", s.Param(n)))
  592. }
  593. }
  594. s.Where = append(s.Where, fmt.Sprintf("`zy_final_material_order`.`deleted_at` = %s", s.Param(0)))
  595. _, size_ok := post["size"]
  596. _, page_ok := post["page"]
  597. if size_ok && page_ok {
  598. var size int64 = 20
  599. var page int64 = 1
  600. if num, ok := db.ToInt64(post["size"]); ok {
  601. size = num
  602. }
  603. if num, ok := db.ToInt64(post["page"]); ok {
  604. page = num
  605. }
  606. s.Limit = size
  607. s.Offset = size * (page - 1)
  608. }
  609. query, params := s.Query()
  610. list, err := db.QueryMap(query, params, nil)
  611. if err != nil {
  612. app.ErrorMsg(c, err.Error(), nil)
  613. return
  614. }
  615. if list == nil {
  616. list = make([]map[string]interface{}, 0)
  617. }
  618. count, err := db.GetCount(s, nil)
  619. if err != nil {
  620. app.ErrorMsg(c, err.Error(), nil)
  621. return
  622. }
  623. app.Success(c, gin.H{
  624. "list": list,
  625. "count": count,
  626. })
  627. }
  628. func FinalMatOrderStatistExport(c *gin.Context) {
  629. var post map[string]interface{}
  630. if err := c.ShouldBindJSON(&post); err != nil {
  631. //app.ErrorMsg(c, err.Error(), nil)
  632. //return
  633. }
  634. var s db.Select
  635. s.TableName = "`zy_final_material_order`"
  636. s.Select = map[string]string{
  637. "date": "UNIX_TIMESTAMP(CONCAT(from_unixtime(`zy_final_material_order`.`take_time`,'%Y-%m'), '-01'))",
  638. "supplier_id": "`zy_final_material_order`.`supplier_id`",
  639. "supplier_name": "`supplier`.`name`",
  640. "count": "COUNT(1)",
  641. "total": "SUM(`zy_final_material_order`.`total`)",
  642. }
  643. s.GroupBy = "UNIX_TIMESTAMP(CONCAT(from_unixtime(`zy_final_material_order`.`take_time`,'%Y-%m'), '-01')), `zy_final_material_order`.`supplier_id`"
  644. s.OrderBy = "UNIX_TIMESTAMP(CONCAT(from_unixtime(`zy_final_material_order`.`take_time`,'%Y-%m'), '-01')) DESC"
  645. s.LeftJoin = []db.Join{{
  646. TableName: "zy_final_supplier",
  647. As: "supplier",
  648. On: []string{"`supplier`.`id` = `zy_final_material_order`.`supplier_id`"},
  649. }}
  650. if date, ok := post["date"]; ok {
  651. if n, ok := db.ToInt64(date); ok {
  652. s.Where = append(s.Where, fmt.Sprintf("UNIX_TIMESTAMP(CONCAT(from_unixtime(`zy_final_material_order`.`take_time`,'%%Y-%%m'), '-01')) = %s", s.Param(n)))
  653. }
  654. }
  655. if startdate, ok := post["startdate"]; ok {
  656. if n, ok := db.ToInt64(startdate); ok {
  657. s.Where = append(s.Where, fmt.Sprintf("UNIX_TIMESTAMP(CONCAT(from_unixtime(`zy_final_material_order`.`take_time`,'%%Y-%%m'), '-01')) >= %s", s.Param(n)))
  658. }
  659. }
  660. if enddate, ok := post["enddate"]; ok {
  661. if n, ok := db.ToInt64(enddate); ok {
  662. s.Where = append(s.Where, fmt.Sprintf("UNIX_TIMESTAMP(CONCAT(from_unixtime(`zy_final_material_order`.`take_time`,'%%Y-%%m'), '-01')) <= %s", s.Param(n)))
  663. }
  664. }
  665. if supplier_id, ok := post["supplier_id"]; ok {
  666. if n, ok := db.ToInt64(supplier_id); ok {
  667. s.Where = append(s.Where, fmt.Sprintf("`zy_final_material_order`.`supplier_id` = %s", s.Param(n)))
  668. }
  669. }
  670. s.Where = append(s.Where, fmt.Sprintf("`zy_final_material_order`.`deleted_at` = %s", s.Param(0)))
  671. query, params := s.Query()
  672. list, err := db.QueryMap(query, params, nil)
  673. if err != nil {
  674. app.ErrorMsg(c, err.Error(), nil)
  675. return
  676. }
  677. if list == nil {
  678. list = make([]map[string]interface{}, 0)
  679. }
  680. export := excelize.NewFile()
  681. rows := make([][]string, 0)
  682. fields := []db.ExportField{
  683. {
  684. Label: "下单时间",
  685. Name: "date",
  686. Width: 20,
  687. },
  688. {
  689. Label: "材料商",
  690. Name: "supplier_name",
  691. Width: 20,
  692. },
  693. {
  694. Label: "订单数",
  695. Name: "count",
  696. Width: 20,
  697. },
  698. {
  699. Label: "订单金额",
  700. Name: "total",
  701. Width: 20,
  702. },
  703. }
  704. header := make([]string, 0)
  705. for i, field := range fields {
  706. header = append(header, field.Label)
  707. if field.Width != 0 {
  708. col, _ := excelize.ColumnNumberToName(i + 1)
  709. export.SetColWidth("Sheet1", col, col, field.Width)
  710. }
  711. }
  712. rows = append(rows, header)
  713. for _, v := range list {
  714. row := make([]string, 0)
  715. for _, field := range fields {
  716. if field.Name == "date" {
  717. dates := ""
  718. date, _ := db.ToFloat64(v["date"])
  719. if date != 0 {
  720. t := time.Unix(int64(date), 0).Local()
  721. dates = t.Format("2006-01")
  722. }
  723. row = append(row, dates)
  724. } else {
  725. row = append(row, db.ToString(v[field.Name]))
  726. }
  727. }
  728. rows = append(rows, row)
  729. }
  730. style, err := export.NewStyle(&excelize.Style{
  731. Alignment: &excelize.Alignment{
  732. Horizontal: "center",
  733. Vertical: "center",
  734. },
  735. })
  736. if err != nil {
  737. app.ErrorMsg(c, err.Error(), nil)
  738. return
  739. }
  740. for i, row := range rows {
  741. //shrow := sh.AddRow()
  742. //shrow.SetHeight(30)
  743. export.SetSheetRow("Sheet1", "A"+strconv.Itoa(i+1), &row)
  744. //for _, cell := range row {
  745. // c := shrow.AddCell()
  746. // c.Value = cell
  747. //}
  748. }
  749. export.SetRowStyle("Sheet1", 1, len(rows), style)
  750. exportFileName := utils.ToStr(time.Now().UnixNano()) + ".xlsx"
  751. b, err := export.WriteToBuffer()
  752. if err != nil {
  753. app.ErrorMsg(c, "导出失败", nil)
  754. return
  755. }
  756. f, err := os.Create(config.Cfg.App.ExportPath + exportFileName)
  757. if err != nil {
  758. app.ErrorMsg(c, "导出失败", nil)
  759. return
  760. }
  761. defer f.Close()
  762. _, _ = b.WriteTo(f)
  763. app.Success(c, gin.H{"path": "export/" + exportFileName, "filename": exportFileName})
  764. }
  765. type FinalMatBatchStateFrom struct {
  766. MatIds []int `form:"mat_ids" json:"mat_ids" binding:"required"`
  767. State int64 `form:"state" json:"state"`
  768. }
  769. func FinalMatBatchState(c *gin.Context) {
  770. var form FinalMatBatchStateFrom
  771. if app.Bind(c, &form) != nil {
  772. return
  773. }
  774. if len(form.MatIds) == 0 {
  775. app.ErrorMsg(c, "没有权限", nil)
  776. return
  777. }
  778. err := db.UpdateModels(db.Type(final.FinalMat{}), map[string]interface{}{
  779. "id in": form.MatIds,
  780. "deleted_at": 0,
  781. }, map[string]interface{}{
  782. "state": form.State,
  783. })
  784. if err != nil {
  785. app.ErrorMsg(c, err.Error(), nil)
  786. return
  787. }
  788. app.Success(c, nil)
  789. }
  790. var num int64
  791. func Generate(t time.Time) string {
  792. s := t.Format(timeformat.Continuity)
  793. m := t.UnixNano()/1e6 - t.UnixNano()/1e9*1e3
  794. ms := sup(m, 3)
  795. p := os.Getpid() % 1000
  796. ps := sup(int64(p), 3)
  797. i := atomic.AddInt64(&num, 1)
  798. r := i % 10000
  799. rs := sup(r, 4)
  800. n := fmt.Sprintf("%s%s%s%s", s, ms, ps, rs)
  801. return n
  802. }
  803. // 对长度不足n的数字前面补0
  804. func sup(i int64, n int) string {
  805. m := fmt.Sprintf("%d", i)
  806. for len(m) < n {
  807. m = fmt.Sprintf("0%s", m)
  808. }
  809. return m
  810. }
  811. func FinalTestSite(c *gin.Context) {
  812. createTestsite(36)
  813. createTestsite(38)
  814. createTestsite(37)
  815. createTestsite(34)
  816. createTestsite(35)
  817. createTestsite(134)
  818. createTestsite(41)
  819. createTestsite(40)
  820. /*createTestsite(102)
  821. createTestsite(104)
  822. createTestsite(97)
  823. createTestsite(100)
  824. createTestsite(132)
  825. createTestsite(90)
  826. createTestsite(87)
  827. createTestsite(99)
  828. createTestsite(89)
  829. createTestsite(94)
  830. createTestsite(133)
  831. createTestsite(92)
  832. createTestsite(95)
  833. createTestsite(105)
  834. createTestsite(103)*/
  835. /*createTestsiteManager(57, 797)
  836. createTestsiteManager(67, 797)
  837. createTestsiteManager(877, 797)
  838. createTestsiteManager(1179, 797)
  839. createTestsiteManager(1218, 797)
  840. createTestsiteManager(1267, 797)
  841. createTestsiteManager(1331, 797)
  842. createTestsiteManager(812, 797)
  843. createTestsiteManager(235, 801)
  844. createTestsiteManager(1211, 801)
  845. createTestsiteManager(1148, 801)
  846. createTestsiteManager(1224, 801)
  847. createTestsiteManager(1308, 801)
  848. createTestsiteManager(1371, 801)
  849. createTestsite(48)
  850. createTestsite(49)
  851. createTestsite(50)
  852. createTestsite(51)
  853. createTestsite(52)
  854. createTestsite(53)
  855. createTestsite(54)
  856. createTestsite(55)
  857. createTestsite(56)
  858. createTestsite(57)
  859. createTestsite(58)
  860. createTestsite(59)
  861. createTestsite(60)
  862. createTestsite(61)
  863. createTestsite(62)
  864. createTestsite(63)
  865. createTestsite(64)
  866. createTestsite(65)
  867. createTestsite(66)
  868. createTestsite(67)
  869. createTestsite(68)
  870. createTestsite(69)
  871. createTestsite(70)
  872. createTestsite(71)
  873. createTestsite(72)
  874. createTestsite(73)
  875. createTestsite(74)
  876. createTestsite(75)
  877. createTestsite(76)
  878. createTestsite(77)
  879. createTestsite(78)
  880. createTestsite(79)
  881. createTestsite(80)
  882. createTestsite(81)
  883. createTestsite(82)
  884. createTestsite(83)
  885. createTestsite(84)
  886. createTestsite(85)
  887. createTestsite(86)
  888. createTestsite(123)
  889. createTestsite(128)
  890. createTestsite(129)
  891. createTestsite(130)
  892. createTestsite(131)*/
  893. app.Success(c, nil)
  894. }
  895. func createTestsite(id int) {
  896. siteid := 1546
  897. var mat final.FinalMat
  898. db.GetModel(map[string]interface{}{
  899. "supplier_id": id,
  900. "state": 1,
  901. }, &mat)
  902. if mat.ID == 0 {
  903. return
  904. }
  905. var mattype final.FinalMatType
  906. db.GetModel(map[string]interface{}{
  907. "id": mat.TypeId,
  908. }, &mattype)
  909. if mattype.ID == 0 {
  910. return
  911. }
  912. var supplier final.FinalSupplier
  913. db.GetModel(map[string]interface{}{
  914. "id": id,
  915. }, &supplier)
  916. if supplier.ID == 0 {
  917. return
  918. }
  919. orderNo := Generate(time.Now())
  920. datas := map[string]interface{}{
  921. "order_no": orderNo,
  922. "site_id": siteid,
  923. "type": mattype.Type,
  924. "is_custom": mattype.IsCustom,
  925. "type_id": 0,
  926. "supplier_id": id,
  927. "total": mat.Price,
  928. "state": 0,
  929. "take_time": time.Now().Unix(),
  930. "created_id": 1083,
  931. }
  932. if mattype.IsCustom == 1 {
  933. datas["state"] = 8
  934. }
  935. orderid, _ := db.InsertModel(db.Type(final.FinalMaterialOrder{}), datas)
  936. db.InsertModel(db.Type(final.FinalMaterialOrderItem{}), map[string]interface{}{
  937. "item_id": 0,
  938. "order_id": orderid,
  939. "mat_id": mat.ID,
  940. "price": mat.Price,
  941. "num": 1,
  942. "total": mat.Price,
  943. "remark": "",
  944. })
  945. db.InsertModel(db.Type(final.FinalMaterialOrderProcess{}), map[string]interface{}{
  946. "order_id": orderid,
  947. "type": 0,
  948. "created_id": 1083,
  949. })
  950. if mattype.IsCustom == 1 {
  951. final.SendMaterialMessage(int(1083), orderNo, orderid, "XXXXXXXXX", "定制品已下单,请通知测量")
  952. } else {
  953. final.SendMaterialMessage(int(supplier.AdminId), orderNo, orderid, "XXXXXXXXX", "订单已下单,请安排备货")
  954. }
  955. }
  956. func createTestsiteManager(id int, project_leader_id int) {
  957. siteid, _ := db.InsertModel(db.Type(final.FinalSite{}), map[string]interface{}{
  958. "type_id": 1,
  959. "area_id": 1,
  960. "username": "测试",
  961. "phone": "13000000000",
  962. "address": "XXXXXXXXX",
  963. "area": 100,
  964. "shop_id": 5,
  965. "manager_id": id,
  966. "project_leader_id": project_leader_id,
  967. "designer_id": 1083,
  968. "created_id": 1083,
  969. "change_state": 1,
  970. })
  971. db.InsertModel(db.Type(final.FinalManagerPrice{}), map[string]interface{}{
  972. "site_id": siteid,
  973. "price": 100000,
  974. })
  975. ptypes := make([]final.FinalPaymentType, 0)
  976. db.GetModel(map[string]interface{}{
  977. "deleted_at": 0,
  978. }, &ptypes)
  979. for _, v := range ptypes {
  980. data := map[string]interface{}{
  981. "type_id": v.ID,
  982. "site_id": siteid,
  983. "state": 1,
  984. }
  985. db.InsertModel(db.Type(final.FinalSitePayment{}), data)
  986. }
  987. db.InsertModel(db.Type(final.FinalMaterial{}), map[string]interface{}{
  988. "type_id": 1,
  989. "site_id": siteid,
  990. "budget": 4500,
  991. })
  992. orderNo := Generate(time.Now())
  993. orderid, _ := db.InsertModel(db.Type(final.FinalMaterialOrder{}), map[string]interface{}{
  994. "order_no": orderNo,
  995. "site_id": siteid,
  996. "type": 1,
  997. "is_custom": 1,
  998. "type_id": 0,
  999. "supplier_id": 112,
  1000. "total": 10988.35,
  1001. "state": 8,
  1002. "take_time": time.Now().Unix(),
  1003. "created_id": 1083,
  1004. })
  1005. db.InsertModel(db.Type(final.FinalMaterialOrderItem{}), map[string]interface{}{
  1006. "item_id": 220,
  1007. "order_id": orderid,
  1008. "mat_id": 4381,
  1009. "price": 410,
  1010. "num": 4.88,
  1011. "total": 2000.8,
  1012. "remark": "",
  1013. })
  1014. db.InsertModel(db.Type(final.FinalMaterialOrderItem{}), map[string]interface{}{
  1015. "item_id": 221,
  1016. "order_id": orderid,
  1017. "mat_id": 4380,
  1018. "price": 485,
  1019. "num": 9,
  1020. "total": 4365,
  1021. "remark": "",
  1022. })
  1023. db.InsertModel(db.Type(final.FinalMaterialOrderItem{}), map[string]interface{}{
  1024. "item_id": 225,
  1025. "order_id": orderid,
  1026. "mat_id": 4378,
  1027. "price": 0,
  1028. "num": 1,
  1029. "total": 0,
  1030. "remark": "",
  1031. })
  1032. db.InsertModel(db.Type(final.FinalMaterialOrderItem{}), map[string]interface{}{
  1033. "item_id": 223,
  1034. "order_id": orderid,
  1035. "mat_id": 4382,
  1036. "price": 388,
  1037. "num": 2,
  1038. "total": 776,
  1039. "remark": "",
  1040. })
  1041. db.InsertModel(db.Type(final.FinalMaterialOrderItem{}), map[string]interface{}{
  1042. "item_id": 224,
  1043. "order_id": orderid,
  1044. "mat_id": 4383,
  1045. "price": 400,
  1046. "num": 1,
  1047. "total": 400,
  1048. "remark": "",
  1049. })
  1050. db.InsertModel(db.Type(final.FinalMaterialOrderItem{}), map[string]interface{}{
  1051. "item_id": 222,
  1052. "order_id": orderid,
  1053. "mat_id": 4379,
  1054. "price": 555,
  1055. "num": 6.21,
  1056. "total": 3446.55,
  1057. "remark": "",
  1058. })
  1059. db.InsertModel(db.Type(final.FinalMaterialOrderProcess{}), map[string]interface{}{
  1060. "order_id": orderid,
  1061. "type": 0,
  1062. "created_id": 1083,
  1063. })
  1064. final.SendMaterialMessage(int(id), orderNo, orderid, "XXXXXXXXX", "定制品已下单,请通知测量")
  1065. }
  1066. func FinalMaterialSettlePaymentExport(c *gin.Context) {
  1067. id := utils.ToInt(c.Param("id"))
  1068. if id <= 0 {
  1069. app.ErrorMsg(c, "id must be a number", nil)
  1070. return
  1071. }
  1072. type FinalMaterialSettle struct {
  1073. ID int64 `json:"id" prop:"add:false"`
  1074. ShopName string `json:"shop_name" prop:"select:shop.shop_name"`
  1075. CreatedAt int64 `json:"created_at" prop:"add:false"`
  1076. AccountName string `json:"account_name" prop:"select:account.account_name"`
  1077. AccountBank string `json:"account_bank" prop:"select:account.account_bank"`
  1078. AccountNo string `json:"account_no" prop:"select:account.account_no"`
  1079. SupplierName string `json:"supplier_name" type:"string" prop:"select:supplier.name" search:"like"`
  1080. Total float64 `json:"total" label:"合计金额" type:"float" prop:"add:false" search:"="`
  1081. final.FinalMaterialSettleMobile
  1082. }
  1083. var model FinalMaterialSettle
  1084. db.GetModel(map[string]interface{}{"id": id}, &model)
  1085. if model.ID == 0 {
  1086. app.ErrorMsg(c, "结算不存在", nil)
  1087. return
  1088. }
  1089. template, err := excelize.OpenFile("fkspdTemplate.xlsx")
  1090. //template, err := xlsx.OpenFile("fkspdTemplate.xlsx")
  1091. if err != nil {
  1092. app.ErrorMsg(c, "系统错误", nil)
  1093. return
  1094. }
  1095. for _, sheet := range template.GetSheetList() {
  1096. template.SetCellValue(sheet, "B3", model.ShopName)
  1097. template.SetCellValue(sheet, "F3", time.Unix(model.CreatedAt, 0).Format("2006.01.02"))
  1098. template.SetCellValue(sheet, "B4", model.AccountName)
  1099. template.SetCellValue(sheet, "B5", model.AccountBank)
  1100. template.SetCellValue(sheet, "E5", model.AccountNo)
  1101. template.SetCellValue(sheet, "B6", model.SupplierName+"(材料款)")
  1102. template.SetCellValue(sheet, "B8", model.Total)
  1103. /*cell, err := sheet.Cell(2, 1)
  1104. if err != nil {
  1105. app.ErrorMsg(c, "系统错误", nil)
  1106. return
  1107. }
  1108. cell.SetString(model.ShopName)
  1109. cell, err = sheet.Cell(2, 5)
  1110. if err != nil {
  1111. app.ErrorMsg(c, "系统错误", nil)
  1112. return
  1113. }
  1114. cell.SetString(time.Unix(model.CreatedAt, 0).Format("2006.01.02"))
  1115. cell, err = sheet.Cell(3, 1)
  1116. if err != nil {
  1117. app.ErrorMsg(c, "系统错误", nil)
  1118. return
  1119. }
  1120. cell.SetString(model.AccountName)
  1121. cell, err = sheet.Cell(4, 1)
  1122. if err != nil {
  1123. app.ErrorMsg(c, "系统错误", nil)
  1124. return
  1125. }
  1126. cell.SetString(model.AccountBank)
  1127. cell, err = sheet.Cell(4, 4)
  1128. if err != nil {
  1129. app.ErrorMsg(c, "系统错误", nil)
  1130. return
  1131. }
  1132. cell.SetString(model.AccountNo)
  1133. cell, err = sheet.Cell(5, 1)
  1134. if err != nil {
  1135. app.ErrorMsg(c, "系统错误", nil)
  1136. return
  1137. }
  1138. cell.SetString(model.SupplierName + "(材料款)")
  1139. cell, err = sheet.Cell(7, 1)
  1140. if err != nil {
  1141. app.ErrorMsg(c, "系统错误", nil)
  1142. return
  1143. }
  1144. cell.SetFloat(model.Total)*/
  1145. }
  1146. exportFileName := utils.ToStr(time.Now().UnixNano()) + ".xlsx"
  1147. b, err := template.WriteToBuffer()
  1148. if err != nil {
  1149. app.ErrorMsg(c, "系统错误", nil)
  1150. return
  1151. }
  1152. f, err := os.Create(config.Cfg.App.ExportPath + exportFileName)
  1153. if err != nil {
  1154. app.ErrorMsg(c, "系统错误", nil)
  1155. return
  1156. }
  1157. defer f.Close()
  1158. _, _ = b.WriteTo(f)
  1159. /*if err := template.Save(config.Cfg.App.ExportPath + exportFileName); err != nil {
  1160. app.ErrorMsg(c, "系统错误", nil)
  1161. return
  1162. }*/
  1163. app.Success(c, gin.H{"path": "export/" + exportFileName, "filename": exportFileName})
  1164. }
  1165. type FinalSiteContractDispatchFrom struct {
  1166. Id int64 `form:"id" json:"id" binding:"required"`
  1167. TypeId int64 `form:"type_id" json:"type_id" binding:"required"`
  1168. ManagerId int64 `form:"manager_id" json:"manager_id" binding:"required"`
  1169. ProjectLeaderId int64 `form:"project_leader_id" json:"project_leader_id" binding:"required"`
  1170. }
  1171. func FinalSiteContractDispatch(c *gin.Context) {
  1172. var forms FinalSiteContractDispatchFrom
  1173. if app.Bind(c, &forms) != nil {
  1174. return
  1175. }
  1176. var model final.FinalSite
  1177. db.GetModel(map[string]interface{}{
  1178. "id": forms.Id,
  1179. "deleted_at": 0,
  1180. }, &model)
  1181. err := db.UpdateModel(db.Type(model), forms.Id, map[string]interface{}{
  1182. "type_id": forms.TypeId,
  1183. "manager_id": forms.ManagerId,
  1184. "project_leader_id": forms.ProjectLeaderId,
  1185. })
  1186. if err != nil {
  1187. app.ErrorMsg(c, err.Error(), nil)
  1188. return
  1189. }
  1190. users, err := user.GetOne(map[string]interface{}{"phone": model.Phone}, nil, nil)
  1191. if err != nil {
  1192. app.ErrorMsg(c, "获取用户信息失败", nil)
  1193. return
  1194. }
  1195. if users == nil {
  1196. app.ErrorMsg(c, "获取用户信息失败", nil)
  1197. return
  1198. }
  1199. var pkg final.FinalPkg
  1200. db.GetModel(map[string]interface{}{
  1201. "id": model.PkgId,
  1202. "deleted_at": 0,
  1203. }, &pkg)
  1204. var typ final.FinalSiteType
  1205. db.GetModel(map[string]interface{}{
  1206. "id": forms.TypeId,
  1207. "deleted_at": 0,
  1208. }, &typ)
  1209. settlements := make([]int64, 0)
  1210. if typ.ID != 0 {
  1211. for _, s := range strings.Split(typ.Settlement, ",") {
  1212. if n, ok := db.ToInt64(s); ok {
  1213. settlements = append(settlements, n)
  1214. }
  1215. }
  1216. }
  1217. ptypes := make([]final.FinalPaymentType, 0)
  1218. db.GetModel(map[string]interface{}{
  1219. "deleted_at": 0,
  1220. }, &ptypes)
  1221. for _, v := range ptypes {
  1222. data := map[string]interface{}{
  1223. "type_id": v.ID,
  1224. "site_id": forms.Id,
  1225. }
  1226. for _, s := range settlements {
  1227. if s == v.ID {
  1228. data["state"] = 1
  1229. }
  1230. }
  1231. id, err := db.InsertModel(db.Type(final.FinalSitePayment{}), data)
  1232. if err == nil {
  1233. final.FinalSitePayment{}.AddAfter(c, id, data, data)
  1234. }
  1235. }
  1236. var order budget2.Order
  1237. if model.OrderId != 0 {
  1238. db.GetModel(map[string]interface{}{
  1239. "id": model.OrderId,
  1240. "deleted_at": 0,
  1241. }, &order)
  1242. }
  1243. if order.ID == 0 {
  1244. var pkg final.FinalPkg
  1245. db.GetModel(map[string]interface{}{
  1246. "id": model.PkgId,
  1247. "deleted_at": 0,
  1248. }, &pkg)
  1249. types := make([]final.FinalType, 0)
  1250. db.GetModel(map[string]interface{}{
  1251. "state": 1,
  1252. "deleted_at": 0,
  1253. }, &types)
  1254. for _, v := range types {
  1255. data := map[string]interface{}{
  1256. "type_id": v.ID,
  1257. "site_id": forms.Id,
  1258. }
  1259. if v.CalcValue != "" {
  1260. expression, err := govaluate.NewEvaluableExpression(v.CalcValue)
  1261. if err == nil {
  1262. parameters := make(map[string]interface{}, 8)
  1263. parameters["面积"] = model.Area
  1264. parameters["套餐"] = pkg.Name
  1265. result, err := expression.Evaluate(parameters)
  1266. if err == nil {
  1267. data["budget"], _ = db.ToFloat64(result)
  1268. }
  1269. }
  1270. }
  1271. id, err := db.InsertModel(db.Type(final.FinalSiteControl{}), data)
  1272. if err == nil {
  1273. final.FinalSiteControl{}.AddAfter(c, id, data, data)
  1274. }
  1275. }
  1276. mauxiliarys := make([]final.FinalMatAuxiliary, 0)
  1277. db.GetModel(map[string]interface{}{
  1278. "preset": 1,
  1279. "deleted_at": 0,
  1280. }, &mauxiliarys)
  1281. for _, v := range mauxiliarys {
  1282. if v.Name == "开工形象" && (model.ShopId == 18 || forms.TypeId == 4) {
  1283. continue
  1284. }
  1285. data := map[string]interface{}{
  1286. "type_id": v.ID,
  1287. "site_id": forms.Id,
  1288. }
  1289. if v.CalcValue != "" {
  1290. expression, err := govaluate.NewEvaluableExpression(v.CalcValue)
  1291. if err == nil {
  1292. parameters := make(map[string]interface{}, 8)
  1293. parameters["面积"] = model.Area
  1294. parameters["套餐"] = pkg.Name
  1295. result, err := expression.Evaluate(parameters)
  1296. if err == nil {
  1297. data["budget"], _ = db.ToFloat64(result)
  1298. }
  1299. }
  1300. }
  1301. id, err := db.InsertModel(db.Type(final.FinalMaterial{}), data)
  1302. if err == nil {
  1303. final.FinalMaterial{}.AddAfter(c, id, data, data)
  1304. }
  1305. }
  1306. address := model.Address
  1307. if model.Village != " " {
  1308. address += " " + model.Village
  1309. }
  1310. if model.RoomNo != " " {
  1311. address += " " + model.RoomNo
  1312. }
  1313. switch model.ShopId {
  1314. case 9, 13, 14, 18:
  1315. final.SendSiteMessage(1003, forms.Id, address, "工地已创建,请及时下单")
  1316. case 10, 12, 15:
  1317. final.SendSiteMessage(1004, forms.Id, address, "工地已创建,请及时下单")
  1318. case 6, 16:
  1319. final.SendSiteMessage(1257, forms.Id, address, "工地已创建,请及时下单")
  1320. case 7, 17:
  1321. final.SendSiteMessage(1173, forms.Id, address, "工地已创建,请及时下单")
  1322. }
  1323. } else {
  1324. o, err := order.LoadOrder()
  1325. if err != nil {
  1326. app.ErrorMsg(c, err.Error(), nil)
  1327. return
  1328. }
  1329. for name, price := range o.Form.ManagerPrice() {
  1330. data := map[string]interface{}{
  1331. "site_id": forms.Id,
  1332. "price": price,
  1333. "explain": name,
  1334. }
  1335. id, err := db.InsertModel(db.Type(final.FinalManagerPrice{}), data)
  1336. if err == nil {
  1337. final.FinalManagerPrice{}.AddAfter(c, id, data, data)
  1338. }
  1339. }
  1340. buildControl := o.Form.BuildControl()
  1341. types := make([]final.FinalType, 0)
  1342. db.GetModel(map[string]interface{}{
  1343. "deleted_at": 0,
  1344. }, &types)
  1345. for _, v := range types {
  1346. budget := buildControl[v.Name]
  1347. if budget != 0 {
  1348. data := map[string]interface{}{
  1349. "type_id": v.ID,
  1350. "site_id": forms.Id,
  1351. "budget": budget,
  1352. }
  1353. id, err := db.InsertModel(db.Type(final.FinalSiteControl{}), data)
  1354. if err == nil {
  1355. final.FinalSiteControl{}.AddAfter(c, id, data, data)
  1356. }
  1357. }
  1358. }
  1359. auxiliaryControl := o.Form.AuxiliaryControl()
  1360. mauxiliarys := make([]final.FinalMatAuxiliary, 0)
  1361. db.GetModel(map[string]interface{}{
  1362. "deleted_at": 0,
  1363. }, &mauxiliarys)
  1364. for _, v := range mauxiliarys {
  1365. budget := auxiliaryControl[v.Name]
  1366. if budget != 0 {
  1367. data := map[string]interface{}{
  1368. "type_id": v.ID,
  1369. "site_id": forms.Id,
  1370. "budget": budget,
  1371. }
  1372. id, err := db.InsertModel(db.Type(final.FinalMaterial{}), data)
  1373. if err == nil {
  1374. final.FinalMaterial{}.AddAfter(c, id, data, data)
  1375. }
  1376. }
  1377. }
  1378. address := model.Address
  1379. if model.Village != " " {
  1380. address += " " + model.Village
  1381. }
  1382. if model.RoomNo != " " {
  1383. address += " " + model.RoomNo
  1384. }
  1385. materials := o.Form.Materials()
  1386. type Mat struct {
  1387. ID int64
  1388. Sum float64
  1389. }
  1390. matss := make([]Mat, 0)
  1391. matids := make([]int64, 0)
  1392. for id, sum := range materials {
  1393. matss = append(matss, Mat{
  1394. ID: id,
  1395. Sum: sum,
  1396. })
  1397. matids = append(matids, id)
  1398. }
  1399. matsss, err := db.GetModelMap(db.Type(final.FinalMatMobile{}), map[string]interface{}{
  1400. "id in": matids,
  1401. "deleted_at": 0,
  1402. }, nil)
  1403. if err != nil {
  1404. app.ErrorMsg(c, err.Error(), nil)
  1405. return
  1406. }
  1407. type Mats struct {
  1408. ID int64
  1409. Type int64
  1410. SupplierId int64
  1411. Price float64
  1412. IsCustom int64
  1413. SupplierAdminId int64
  1414. }
  1415. matMap := make(map[int64]Mats)
  1416. for _, mat := range matsss {
  1417. supplier_id, _ := db.ToInt64(mat["supplier_id"])
  1418. supplier_admin_id, _ := db.ToInt64(mat["supplier_admin_id"])
  1419. id, _ := db.ToInt64(mat["id"])
  1420. typ, _ := db.ToInt64(mat["type"])
  1421. price, _ := db.ToFloat64(mat["price"])
  1422. is_custom, _ := db.ToInt64(mat["is_custom"])
  1423. matMap[id] = Mats{
  1424. ID: id,
  1425. Type: typ,
  1426. SupplierId: supplier_id,
  1427. Price: price,
  1428. SupplierAdminId: supplier_admin_id,
  1429. IsCustom: is_custom,
  1430. }
  1431. }
  1432. cTotal := float64(0)
  1433. itemMap := make(map[int64]map[int64]map[int64][]final.FinalMaterialOrderItem, 0)
  1434. supplierAdminMap := make(map[int64]int64)
  1435. supplierTotalMap := make(map[int64]float64)
  1436. for _, v := range matss {
  1437. if v.Sum <= 0 {
  1438. continue
  1439. }
  1440. if mat, ok := matMap[v.ID]; ok {
  1441. supplierAdminMap[mat.SupplierId] = mat.SupplierAdminId
  1442. if _, ok := itemMap[mat.Type]; !ok {
  1443. itemMap[mat.Type] = make(map[int64]map[int64][]final.FinalMaterialOrderItem)
  1444. }
  1445. if _, ok := itemMap[mat.Type][mat.IsCustom]; !ok {
  1446. itemMap[mat.Type][mat.IsCustom] = make(map[int64][]final.FinalMaterialOrderItem)
  1447. }
  1448. is := make([]final.FinalMaterialOrderItem, 0)
  1449. if s, ok := itemMap[mat.Type][mat.IsCustom][mat.SupplierId]; ok {
  1450. is = s
  1451. }
  1452. total := utils.FloatMul(mat.Price, v.Sum, 2)
  1453. is = append(is, final.FinalMaterialOrderItem{
  1454. MatId: mat.ID,
  1455. Price: mat.Price,
  1456. Num: v.Sum,
  1457. Total: total,
  1458. })
  1459. itemMap[mat.Type][mat.IsCustom][mat.SupplierId] = is
  1460. if _, ok := supplierTotalMap[mat.SupplierId]; !ok {
  1461. supplierTotalMap[mat.SupplierId] = 0
  1462. }
  1463. supplierTotalMap[mat.SupplierId] = utils.FloatAdd(supplierTotalMap[mat.SupplierId], total, 2)
  1464. cTotal = utils.FloatAdd(cTotal, total, 2)
  1465. }
  1466. }
  1467. supplierids := make([]int64, 0)
  1468. for id, _ := range supplierAdminMap {
  1469. supplierids = append(supplierids, id)
  1470. }
  1471. suppliers, err := db.GetModelMap(db.Type(final.FinalSupplierPrepaymentStatist{}), map[string]interface{}{
  1472. "id in": supplierids,
  1473. "prepayment": 1,
  1474. "deleted_at": 0,
  1475. }, nil)
  1476. if err != nil {
  1477. app.ErrorMsg(c, err.Error(), nil)
  1478. return
  1479. }
  1480. for _, v := range suppliers {
  1481. id, _ := db.ToInt64(v["id"])
  1482. name := db.ToString(v["name"])
  1483. warning_amount, _ := db.ToFloat64(v["warning_amount"])
  1484. notice_ids := db.ToString(v["notice_ids"])
  1485. total, _ := db.ToFloat64(v["total"])
  1486. noticeIds := make([]int64, 0)
  1487. for _, i := range strings.Split(notice_ids, ",") {
  1488. if i != "" {
  1489. if n, ok := db.ToInt64(i); ok {
  1490. noticeIds = append(noticeIds, n)
  1491. }
  1492. }
  1493. }
  1494. if supplierTotalMap[id] > total {
  1495. for _, i := range noticeIds {
  1496. err := final.SendMaterialMessage(int(i), "", 0, address, "材料商"+name+"预付款金额不足,下单失败")
  1497. logger.Sugar.Infof("SendMaterialMessage, err: %v", err)
  1498. }
  1499. app.ErrorMsg(c, "材料商"+name+"预付款金额不足,下单失败", nil)
  1500. return
  1501. }
  1502. if total-supplierTotalMap[id] <= warning_amount {
  1503. for _, i := range noticeIds {
  1504. err := final.SendMaterialMessage(int(i), "", 0, address, "材料商"+name+"预付款金额仅剩"+db.ToString(total-supplierTotalMap[id]))
  1505. logger.Sugar.Infof("SendMaterialMessage, err: %v", err)
  1506. }
  1507. }
  1508. }
  1509. orderNo := Generate(time.Now())
  1510. n := 0
  1511. supplierOrderMap := make(map[int64]final.FinalMaterialOrder)
  1512. customOrders := make([]final.FinalMaterialOrder, 0)
  1513. for ctyp, itemmap1 := range itemMap {
  1514. for is_custom, itemmap2 := range itemmap1 {
  1515. for supplier_id, items := range itemmap2 {
  1516. n++
  1517. order_no := orderNo
  1518. order_no = order_no + "-" + db.ToString(n)
  1519. total := float64(0)
  1520. cartids := make([]int64, 0)
  1521. for _, v := range items {
  1522. cartids = append(cartids, v.ID)
  1523. total = utils.FloatAdd(total, v.Total, 2)
  1524. }
  1525. datas := map[string]interface{}{
  1526. "order_no": order_no,
  1527. "site_id": model.ID,
  1528. "type": ctyp,
  1529. "is_custom": is_custom,
  1530. "supplier_id": supplier_id,
  1531. "total": total,
  1532. "state": 0,
  1533. "take_time": time.Now().Unix(),
  1534. "created_id": 0,
  1535. }
  1536. if is_custom == 1 {
  1537. datas["state"] = 8
  1538. }
  1539. orderid, err := db.InsertModel(db.Type(final.FinalMaterialOrder{}), datas)
  1540. if err != nil {
  1541. app.ErrorMsg(c, err.Error(), nil)
  1542. return
  1543. }
  1544. if is_custom == 0 {
  1545. supplierOrderMap[supplier_id] = final.FinalMaterialOrder{
  1546. ID: orderid,
  1547. OrderNo: order_no,
  1548. }
  1549. } else {
  1550. customOrders = append(customOrders, final.FinalMaterialOrder{
  1551. ID: orderid,
  1552. OrderNo: order_no,
  1553. })
  1554. }
  1555. for _, v := range items {
  1556. _, err := db.InsertModel(db.Type(final.FinalMaterialOrderItem{}), map[string]interface{}{
  1557. "item_id": v.ItemId,
  1558. "order_id": orderid,
  1559. "mat_id": v.MatId,
  1560. "price": v.Price,
  1561. "num": v.Num,
  1562. "total": v.Total,
  1563. "remark": v.Remark,
  1564. })
  1565. if err != nil {
  1566. app.ErrorMsg(c, err.Error(), nil)
  1567. return
  1568. }
  1569. }
  1570. _, err = db.InsertModel(db.Type(final.FinalMaterialOrderProcess{}), map[string]interface{}{
  1571. "order_id": orderid,
  1572. "type": 0,
  1573. "created_id": 0,
  1574. })
  1575. if err != nil {
  1576. app.ErrorMsg(c, err.Error(), nil)
  1577. return
  1578. }
  1579. }
  1580. }
  1581. }
  1582. for s, o := range supplierOrderMap {
  1583. err := final.SendMaterialMessage(int(supplierAdminMap[s]), o.OrderNo, o.ID, address, "订单已下单,请安排备货")
  1584. logger.Sugar.Infof("SendMaterialMessage, err: %v", err)
  1585. }
  1586. for _, o := range customOrders {
  1587. err := final.SendMaterialMessage(int(model.ManagerId), o.OrderNo, o.ID, address, "定制品已下单,请通知测量")
  1588. logger.Sugar.Infof("SendMaterialMessage, err: %v", err)
  1589. }
  1590. }
  1591. err = db.UpdateModel(db.Type(order), model.OrderId, map[string]interface{}{
  1592. "state": 2,
  1593. })
  1594. if err != nil {
  1595. app.ErrorMsg(c, err.Error(), nil)
  1596. return
  1597. }
  1598. address := model.Village + model.RoomNo
  1599. if address == "" {
  1600. address = model.Address
  1601. }
  1602. houseList := make([]*structs.HouseList, 0)
  1603. _, err = user.GetHouseList(map[string]interface{}{"user_id": users.ID, "deleted_at": 0}, nil, app.Page{}, &houseList)
  1604. if err != nil {
  1605. app.ErrorMsg(c, err.Error(), nil)
  1606. return
  1607. }
  1608. haveHouse := false
  1609. for _, house := range houseList {
  1610. if house.Address == address {
  1611. haveHouse = true
  1612. break
  1613. }
  1614. }
  1615. if !haveHouse {
  1616. /*user.HouseAdd(form.HouseAdd{
  1617. UserID: users.ID,
  1618. PkgID: int(pkg.MatpkgId),
  1619. ShopID: int(model.ShopId),
  1620. Salesman: int(model.SalesmanId),
  1621. ProjectLeader: int(model.ProjectLeaderId),
  1622. Address: address,
  1623. Designer: int(model.DesignerId),
  1624. Supervisor: int(model.ManagerId),
  1625. ProjectStart: time.Unix(model.StartTime, 0).Format("2006-01-02"),
  1626. ProjectEnd: time.Unix(model.EndTime, 0).Format("2006-01-02"),
  1627. })*/
  1628. houseMap := map[string]interface{}{
  1629. "user_id": users.ID,
  1630. "pkg_id": pkg.MatpkgId,
  1631. "shop_id": model.ShopId,
  1632. //"district": form.District,
  1633. "salesman": model.SalesmanId,
  1634. //"project_manager": form.ProjectManager,
  1635. "project_leader": forms.ProjectLeaderId,
  1636. "address": address,
  1637. "designer": model.DesignerId,
  1638. "supervisor": forms.ManagerId,
  1639. "project_start": model.StartTime,
  1640. "project_end": model.EndTime,
  1641. //"user_ids": db.ToString(form.UserID),
  1642. //"mark": form.Mark,
  1643. "link_name": users.Name,
  1644. "link_phone": users.Phone,
  1645. }
  1646. db.InsertOne(user.UserHouse.TableName(), houseMap)
  1647. }
  1648. app.Success(c, nil)
  1649. }
  1650. func FinalMaterialSettleBalancePaymentExport(c *gin.Context) {
  1651. id := utils.ToInt(c.Param("id"))
  1652. if id <= 0 {
  1653. app.ErrorMsg(c, "id must be a number", nil)
  1654. return
  1655. }
  1656. var settle final.FinalSettle
  1657. db.GetModel(map[string]interface{}{
  1658. "id": id,
  1659. }, &settle)
  1660. if settle.ID == 0 {
  1661. app.ErrorMsg(c, "结算不存在", nil)
  1662. return
  1663. }
  1664. var site final.FinalSite
  1665. db.GetModel(map[string]interface{}{
  1666. "id": settle.SiteId,
  1667. }, &site)
  1668. if site.ID == 0 {
  1669. app.ErrorMsg(c, "工地不存在", nil)
  1670. return
  1671. }
  1672. var manager models.Admin
  1673. db.GetModel(map[string]interface{}{
  1674. "id": site.ManagerId,
  1675. }, &manager)
  1676. if manager.ID == 0 {
  1677. app.ErrorMsg(c, "项目经理不存在", nil)
  1678. return
  1679. }
  1680. type FinalSiteTableCollects struct {
  1681. final.FinalSiteTableCollect
  1682. Name string `json:"name" label:"类别名称" prop:"select:finaltype.name"`
  1683. ShopId int64 `json:"shop_id" label:"门店" type:"int" prop:"select:finalsite.shop_id" search:"="`
  1684. Total float64 `json:"total" label:"合计" prop:"select:finalsiteitem.total"`
  1685. State int64 `json:"state" label:"状态" type:"int"`
  1686. Deduct int64 `json:"deduct" type:"int" prop:"select:finaltype.deduct"`
  1687. }
  1688. tables := make([]FinalSiteTableCollects, 0)
  1689. db.GetModel(map[string]interface{}{
  1690. "site_id": site.ID,
  1691. "deleted_at": 0,
  1692. }, &tables)
  1693. tableMap := make(map[string]float64)
  1694. for _, v := range tables {
  1695. if v.State == -1 {
  1696. continue
  1697. }
  1698. if v.State < 3 {
  1699. app.ErrorMsg(c, "工人结算未完成", nil)
  1700. return
  1701. }
  1702. if v.Deduct == 0 {
  1703. tableMap[v.Name] = utils.FloatAdd(tableMap[v.Name], v.Total, -1)
  1704. }
  1705. }
  1706. logger.Sugar.Infof("tableMap %v", tableMap)
  1707. type FinalMaterialCollects struct {
  1708. final.FinalMaterialMobile
  1709. Budget float64 `json:"budget" label:"预算" type:"float" prop:"edit" default:"0"`
  1710. State int64 `json:"state" label:"状态" type:"int" prop:"add:false" default:"0" search:"="`
  1711. Name string `json:"name" label:"名称" prop:"select:finalmatauxiliary.name"`
  1712. Total float64 `json:"total" label:"金额" prop:"select:ROUND(ifnull(sum(order.total),0))"`
  1713. CompletedTotal float64 `json:"completed_total" type:"float" prop:"select:sum(IF((order.state=7)or(order.state=11)or(order.state=12),ROUND(order.total),0))"`
  1714. }
  1715. materials := make([]FinalMaterialCollects, 0)
  1716. db.GetModel(map[string]interface{}{
  1717. "site_id": site.ID,
  1718. "deleted_at": 0,
  1719. }, &materials)
  1720. materialMap := make(map[string]float64)
  1721. for _, v := range materials {
  1722. if v.Budget != 0 && v.State != 1 {
  1723. app.ErrorMsg(c, "辅材未下单", nil)
  1724. return
  1725. }
  1726. logger.Sugar.Infof("v.Total %v v.CompletedTotal %v", v.Total, v.CompletedTotal)
  1727. if v.Total != v.CompletedTotal {
  1728. app.ErrorMsg(c, "订单未完成", nil)
  1729. return
  1730. }
  1731. materialMap[v.Name] = utils.FloatAdd(materialMap[v.Name], v.Total, -1)
  1732. }
  1733. lines := len(tableMap)
  1734. if len(materialMap) > lines {
  1735. lines = len(materialMap)
  1736. }
  1737. lines++
  1738. export := excelize.NewFile()
  1739. style, err := export.NewStyle(&excelize.Style{
  1740. Border: []excelize.Border{
  1741. {Type: "left", Color: "000000", Style: 1},
  1742. {Type: "top", Color: "000000", Style: 1},
  1743. {Type: "bottom", Color: "000000", Style: 1},
  1744. {Type: "right", Color: "000000", Style: 1},
  1745. },
  1746. Alignment: &excelize.Alignment{
  1747. Horizontal: "center",
  1748. Vertical: "center",
  1749. },
  1750. })
  1751. if err != nil {
  1752. app.ErrorMsg(c, err.Error(), nil)
  1753. return
  1754. }
  1755. worksite := site.Village + "" + site.RoomNo
  1756. if worksite == "" {
  1757. worksite = site.Address
  1758. }
  1759. sheet := export.GetSheetList()[0]
  1760. XlsxSetCellValue(export, sheet, 1, 1, worksite+" "+manager.Username)
  1761. cell1, _ := excelize.CoordinatesToCellName(1, 1)
  1762. cell2, _ := excelize.CoordinatesToCellName(lines, 1)
  1763. if cell1 != cell2 {
  1764. export.MergeCell(sheet, cell1, cell2)
  1765. }
  1766. n := 1
  1767. total := float64(0)
  1768. prices := float64(0)
  1769. for name, price := range tableMap {
  1770. XlsxSetCellValue(export, sheet, n, 2, name)
  1771. XlsxSetCellValue(export, sheet, n, 3, price)
  1772. prices = utils.FloatAdd(prices, price, -1)
  1773. n++
  1774. }
  1775. XlsxSetCellValue(export, sheet, lines, 2, "合计")
  1776. XlsxSetCellValue(export, sheet, lines, 3, prices)
  1777. total = utils.FloatAdd(total, prices, -1)
  1778. n = 1
  1779. prices = float64(0)
  1780. for name, price := range materialMap {
  1781. XlsxSetCellValue(export, sheet, n, 4, name)
  1782. XlsxSetCellValue(export, sheet, n, 5, price)
  1783. prices = utils.FloatAdd(prices, price, -1)
  1784. n++
  1785. }
  1786. //XlsxSetCellValue(export, sheet, n, 4, "合计")
  1787. XlsxSetCellValue(export, sheet, lines, 5, prices)
  1788. total = utils.FloatAdd(total, prices, -1)
  1789. XlsxSetCellValue(export, sheet, 4, 7, "合计")
  1790. XlsxSetCellValue(export, sheet, 5, 7, total)
  1791. cell3, _ := excelize.CoordinatesToCellName(lines, 5)
  1792. export.SetCellStyle(sheet, cell1, cell3, style)
  1793. exportFileName := utils.ToStr(time.Now().UnixNano()) + ".xlsx"
  1794. b, err := export.WriteToBuffer()
  1795. if err != nil {
  1796. app.ErrorMsg(c, "导出失败", nil)
  1797. return
  1798. }
  1799. f, err := os.Create(config.Cfg.App.ExportPath + exportFileName)
  1800. if err != nil {
  1801. app.ErrorMsg(c, "导出失败", nil)
  1802. return
  1803. }
  1804. defer f.Close()
  1805. _, _ = b.WriteTo(f)
  1806. app.Success(c, gin.H{"path": "export/" + exportFileName, "filename": exportFileName})
  1807. }
  1808. func FinalSettleMaterialCollectExport(c *gin.Context) {
  1809. id := utils.ToInt(c.Param("id"))
  1810. if id <= 0 {
  1811. app.ErrorMsg(c, "id must be a number", nil)
  1812. return
  1813. }
  1814. var settle final.FinalSettle
  1815. db.GetModel(map[string]interface{}{
  1816. "id": id,
  1817. }, &settle)
  1818. if settle.ID == 0 {
  1819. app.ErrorMsg(c, "结算不存在", nil)
  1820. return
  1821. }
  1822. var site final.FinalSite
  1823. db.GetModel(map[string]interface{}{
  1824. "id": settle.SiteId,
  1825. }, &site)
  1826. if site.ID == 0 {
  1827. app.ErrorMsg(c, "工地不存在", nil)
  1828. return
  1829. }
  1830. var pkg final.FinalPkg
  1831. db.GetModel(map[string]interface{}{
  1832. "id": site.PkgId,
  1833. }, &pkg)
  1834. if pkg.ID == 0 {
  1835. app.ErrorMsg(c, "套餐不存在", nil)
  1836. return
  1837. }
  1838. var designer models.Admin
  1839. db.GetModel(map[string]interface{}{
  1840. "id": site.DesignerId,
  1841. }, &designer)
  1842. if designer.ID == 0 {
  1843. app.ErrorMsg(c, "设计师不存在", nil)
  1844. return
  1845. }
  1846. var manager models.Admin
  1847. db.GetModel(map[string]interface{}{
  1848. "id": site.ManagerId,
  1849. }, &manager)
  1850. if manager.ID == 0 {
  1851. app.ErrorMsg(c, "项目经理不存在", nil)
  1852. return
  1853. }
  1854. var amount final.FinalSiteAmount
  1855. db.GetModel(map[string]interface{}{
  1856. "site_id": site.ID,
  1857. }, &amount)
  1858. discount := ""
  1859. if amount.ID != 0 {
  1860. from := utils.JsonDecode(db.ToString(amount.Content)).ToMap()
  1861. discounts, _ := db.ToFloat64(from["报价折扣"])
  1862. if discounts != 0 {
  1863. discount = db.ToString(discounts*10) + "折"
  1864. }
  1865. }
  1866. type FinalMaterialOrder struct {
  1867. final.FinalMaterialOrderMobile
  1868. State int64 `json:"state" label:"状态" type:"int" prop:"add:false" default:"0" search:"="`
  1869. Total float64 `json:"total" label:"金额" type:"float" prop:"add:false" default:"0"`
  1870. SupplierName string `json:"supplier_name" type:"string" prop:"select:supplier.name" search:"like"`
  1871. }
  1872. orders := make([]FinalMaterialOrder, 0)
  1873. db.GetModel(map[string]interface{}{
  1874. "site_id": site.ID,
  1875. "type": 1,
  1876. "deleted_at": 0,
  1877. }, &orders)
  1878. logger.Sugar.Infof("len(orders) %v", len(orders))
  1879. orderMap := make(map[string]float64)
  1880. for _, v := range orders {
  1881. if v.State == -1 {
  1882. continue
  1883. }
  1884. if v.State != 7 && v.State != 11 && v.State != 12 {
  1885. app.ErrorMsg(c, "材料订单未完成", nil)
  1886. return
  1887. }
  1888. orderMap[v.SupplierName] = utils.FloatAdd(orderMap[v.SupplierName], v.Total, -1)
  1889. }
  1890. num := len(orderMap) + 1
  1891. line := int(math.Ceil(float64(num) / 3))
  1892. worksite := site.Village + "" + site.RoomNo
  1893. if worksite == "" {
  1894. worksite = site.Address
  1895. }
  1896. export := excelize.NewFile()
  1897. style, err := export.NewStyle(&excelize.Style{
  1898. Border: []excelize.Border{
  1899. {Type: "left", Color: "000000", Style: 1},
  1900. {Type: "top", Color: "000000", Style: 1},
  1901. {Type: "bottom", Color: "000000", Style: 1},
  1902. {Type: "right", Color: "000000", Style: 1},
  1903. },
  1904. Alignment: &excelize.Alignment{
  1905. Horizontal: "center",
  1906. Vertical: "center",
  1907. },
  1908. })
  1909. if err != nil {
  1910. app.ErrorMsg(c, err.Error(), nil)
  1911. return
  1912. }
  1913. sheet := export.GetSheetList()[0]
  1914. XlsxSetCellValue(export, sheet, 1, 1, "项目名称")
  1915. XlsxSetCellValue(export, sheet, 2, 1, worksite)
  1916. XlsxSetCellValue(export, sheet, 5, 1, "设计师")
  1917. XlsxSetCellValue(export, sheet, 6, 1, designer.Username)
  1918. XlsxSetCellValue(export, sheet, 7, 1, "项目监理")
  1919. XlsxSetCellValue(export, sheet, 8, 1, manager.Username)
  1920. XlsxSetCellValue(export, sheet, 9, 1, "套餐")
  1921. XlsxSetCellValue(export, sheet, 10, 1, pkg.Name)
  1922. XlsxSetCellValue(export, sheet, 11, 1, "折扣")
  1923. XlsxSetCellValue(export, sheet, 12, 1, discount)
  1924. mcell1, _ := excelize.CoordinatesToCellName(2, 1)
  1925. mcell2, _ := excelize.CoordinatesToCellName(4, 1)
  1926. if mcell1 != mcell2 {
  1927. export.MergeCell(sheet, mcell1, mcell2)
  1928. }
  1929. for _, n := range []int{0, 4, 8} {
  1930. XlsxSetCellValue(export, sheet, 1+n, 2, "品名")
  1931. XlsxSetCellValue(export, sheet, 2+n, 2, "品牌")
  1932. XlsxSetCellValue(export, sheet, 3+n, 2, "实际金额")
  1933. XlsxSetCellValue(export, sheet, 4+n, 2, "备注")
  1934. }
  1935. n := 0
  1936. total := float64(0)
  1937. for name, price := range orderMap {
  1938. col := int(math.Floor(float64(n) / float64(line)))
  1939. row := n - col*line
  1940. col = col * 4
  1941. XlsxSetCellValue(export, sheet, 2+col, 3+row, name)
  1942. XlsxSetCellValue(export, sheet, 3+col, 3+row, price)
  1943. total = utils.FloatAdd(total, price, -1)
  1944. n++
  1945. }
  1946. XlsxSetCellValue(export, sheet, 10, line+2, "合计")
  1947. XlsxSetCellValue(export, sheet, 11, line+2, total)
  1948. cell1, _ := excelize.CoordinatesToCellName(1, 1)
  1949. cell2, _ := excelize.CoordinatesToCellName(12, line+2)
  1950. export.SetCellStyle(sheet, cell1, cell2, style)
  1951. exportFileName := utils.ToStr(time.Now().UnixNano()) + ".xlsx"
  1952. b, err := export.WriteToBuffer()
  1953. if err != nil {
  1954. app.ErrorMsg(c, "导出失败", nil)
  1955. return
  1956. }
  1957. f, err := os.Create(config.Cfg.App.ExportPath + exportFileName)
  1958. if err != nil {
  1959. app.ErrorMsg(c, "导出失败", nil)
  1960. return
  1961. }
  1962. defer f.Close()
  1963. _, _ = b.WriteTo(f)
  1964. app.Success(c, gin.H{"path": "export/" + exportFileName, "filename": exportFileName})
  1965. }
  1966. func XlsxSetCellValue(file *excelize.File, sheet string, col int, row int, value interface{}) error {
  1967. cell, err := excelize.CoordinatesToCellName(col, row)
  1968. if err != nil {
  1969. return err
  1970. }
  1971. err = file.SetCellValue(sheet, cell, value)
  1972. if err != nil {
  1973. return err
  1974. }
  1975. return nil
  1976. }