base.go 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290
  1. package pkg2024
  2. import (
  3. "bytes"
  4. "compress/gzip"
  5. "encoding/json"
  6. "errors"
  7. "io/ioutil"
  8. "math"
  9. "os"
  10. "sort"
  11. "strings"
  12. "time"
  13. "zhiyuan/models"
  14. "zhiyuan/models/final"
  15. "zhiyuan/pkg/app"
  16. "zhiyuan/pkg/config"
  17. "zhiyuan/pkg/db"
  18. "zhiyuan/pkg/utils"
  19. "github.com/gin-gonic/gin"
  20. "github.com/xuri/excelize/v2"
  21. )
  22. type Map map[string]interface{}
  23. const (
  24. A10 int = iota
  25. A8
  26. A5
  27. ZZ1_0
  28. )
  29. type Pkg struct {
  30. Type int `form:"type" json:"type"`
  31. Layout []int `form:"layout" json:"layout"`
  32. Area float64 `form:"area" json:"area"`
  33. }
  34. type Window struct {
  35. Length float64 `form:"length" json:"length"`
  36. Width float64 `form:"width" json:"width"`
  37. Height float64 `form:"height" json:"height"`
  38. }
  39. type Space struct {
  40. Area float64 `form:"area" json:"area"`
  41. WetArea float64 `form:"wet_area" json:"wet_area"`
  42. Perimeter float64 `form:"perimeter" json:"perimeter"`
  43. DoorwayWidth float64 `form:"doorway_width" json:"doorway_width"`
  44. DoorwayHeight float64 `form:"doorway_height" json:"doorway_height"`
  45. DoorwayWallThickness float64 `form:"doorway_wall_thickness" json:"doorway_wall_thickness"`
  46. WindowNumber int `form:"window_number" json:"window_number"`
  47. Windows []Window `form:"windows" json:"windows"`
  48. SinkBackfill bool `form:"sink_backfill" json:"sink_backfill"`
  49. WideBed bool `form:"wide_bed" json:"wide_bed"`
  50. DryWetSeparation bool `form:"dry_wet_separation" json:"dry_wet_separation"`
  51. }
  52. type RoomData struct {
  53. Pkg Pkg `form:"pkg" json:"pkg"`
  54. Space [][]Space `form:"space" json:"space"`
  55. }
  56. type ContractData struct {
  57. Design float64 `form:"design" json:"design"`
  58. Chart float64 `form:"chart" json:"chart"`
  59. Taxes bool `form:"taxes" json:"taxes"`
  60. Discount float64 `form:"discount" json:"discount"`
  61. }
  62. type PkgForm struct {
  63. RoomData RoomData `json:"room_data"`
  64. RegionData RegionData `json:"region_data"`
  65. ContractData ContractData `json:"contract_data"`
  66. AdditionalData AdditionalData `json:"additional_data"`
  67. DeductionData DeductionData `json:"deduction_data"`
  68. BuildBudget BuildBudget `json:"build_budget"`
  69. }
  70. type BuildItemReturn struct {
  71. Name string `json:"name"`
  72. Type int `json:"type"`
  73. Price float64 `json:"price"`
  74. Unit string `json:"unit"`
  75. Remark string `json:"remark"`
  76. }
  77. type PkgReturn struct {
  78. RoomData RoomData `json:"room_data"`
  79. RegionData RegionReturns `json:"region_data"`
  80. ContractData ContractData `json:"contract_data"`
  81. BuildBudget BuildBudget `json:"build_budget"`
  82. BuildItems []BuildItemReturn `json:"build_item"`
  83. }
  84. func (from *PkgForm) Init(pkgId int64, area float64, layout []int) error {
  85. layouts := []int{1, 1, 1, 1, 0}
  86. if layout != nil {
  87. for i, l := range layout {
  88. if i < len(layouts) && l > layouts[i] {
  89. layouts[i] = l
  90. }
  91. }
  92. }
  93. pkgs := map[int64]int{3: A10, 4: A8, 5: A5, 16: ZZ1_0}
  94. from.RoomData = RoomData{
  95. Pkg: Pkg{
  96. Area: area,
  97. Type: pkgs[pkgId],
  98. Layout: layouts,
  99. },
  100. Space: [][]Space{
  101. {},
  102. {},
  103. {},
  104. {},
  105. {},
  106. },
  107. }
  108. for n, l := range layouts {
  109. if n == 1 && l > 1 {
  110. l = l - 1
  111. }
  112. space := Space{
  113. DoorwayHeight: 2.2,
  114. DoorwayWidth: 0.9,
  115. DoorwayWallThickness: 0.14,
  116. WindowNumber: 1,
  117. Windows: []Window{
  118. {
  119. Length: 1.6,
  120. Height: 1.7,
  121. Width: 0.24,
  122. },
  123. },
  124. }
  125. if n == 1 {
  126. space = Space{
  127. DoorwayHeight: 2.1,
  128. DoorwayWidth: 1.2,
  129. DoorwayWallThickness: 0.24,
  130. WindowNumber: 0,
  131. Windows: []Window{},
  132. }
  133. }
  134. if n >= 2 {
  135. space = Space{
  136. DoorwayHeight: 2,
  137. DoorwayWidth: 0.8,
  138. DoorwayWallThickness: 0.14,
  139. WindowNumber: 1,
  140. Windows: []Window{
  141. {
  142. Length: 0.8,
  143. Height: 1.4,
  144. Width: 0.24,
  145. },
  146. },
  147. }
  148. }
  149. if n == 4 {
  150. space = Space{
  151. DoorwayHeight: 2.35,
  152. DoorwayWidth: 2.4,
  153. DoorwayWallThickness: 0.24,
  154. WindowNumber: 1,
  155. Windows: []Window{
  156. {
  157. Length: 5,
  158. Height: 2.2,
  159. Width: 0.24,
  160. },
  161. },
  162. }
  163. }
  164. for o := 0; o < l; o++ {
  165. from.RoomData.Space[n] = append(from.RoomData.Space[n], space)
  166. }
  167. }
  168. from.ContractData.Chart = 15
  169. from.ContractData.Discount = 1
  170. from.RegionData = make(RegionData)
  171. from.DeductionData = make(DeductionData)
  172. from.AdditionalData.Builds = []BuildAdditionalItem{{
  173. Item: "拆除砖墙(有电梯)",
  174. }, {
  175. Item: "拆除门垛",
  176. }, {
  177. Item: "拆除后水泥沙浆粉刷(宽30㎝以内)",
  178. }, {
  179. Item: "砌门垛",
  180. }, {
  181. Item: "新砌砖墙(12墙)",
  182. }, {
  183. Item: "新砌砖墙(24墙)",
  184. }, {
  185. Item: "过桥板",
  186. }, {
  187. Item: "卫生间墙面打磨(油性防水层)",
  188. }, {
  189. Item: "卫生间回填(陶粒回填)",
  190. }, {
  191. Item: "安装石基",
  192. }, {
  193. Item: "外墙乳胶漆打磨",
  194. }, {
  195. Item: "阳台地面防水",
  196. }, {
  197. Item: "地面找平",
  198. }, {
  199. Item: "墙面贴砖(400*800mm)",
  200. }}
  201. from.AdditionalData.Materials = make([]MaterialAdditionalItem, 0)
  202. from.AdditionalData.Specials = make([]SpecialProjectItem, 0)
  203. return from.Calc()
  204. }
  205. func (from *PkgForm) UpdateData(data RoomData) error {
  206. if data.Pkg.Layout == nil || len(data.Pkg.Layout) != 5 {
  207. return errors.New("请输入户型")
  208. }
  209. if data.Space == nil || len(data.Space) != len(data.Pkg.Layout) {
  210. return errors.New("房间数据错误")
  211. }
  212. for typ, spaces := range data.Space {
  213. num := data.Pkg.Layout[typ]
  214. if typ == 1 && num > 1 {
  215. num = num - 1
  216. }
  217. if spaces == nil || len(spaces) != num {
  218. return errors.New("房间数据错误")
  219. }
  220. for _, space := range spaces {
  221. if space.WindowNumber != 0 {
  222. if space.Windows == nil || len(space.Windows) != space.WindowNumber {
  223. return errors.New("房间数据错误")
  224. }
  225. }
  226. }
  227. }
  228. context := from.NewContext()
  229. context.oldRoomData = from.RoomData
  230. from.RoomData = data
  231. return from.CalcInContext(context)
  232. }
  233. func (from *PkgForm) RefreshRegion(context *ItemContext) {
  234. if from.RegionData == nil {
  235. from.RegionData = RegionData{
  236. -1: {},
  237. 0: {},
  238. 1: {},
  239. 2: {},
  240. 3: {},
  241. 4: {},
  242. }
  243. }
  244. if from.DeductionData == nil {
  245. from.DeductionData = DeductionData{
  246. -1: {},
  247. 0: {},
  248. 1: {},
  249. 2: {},
  250. 3: {},
  251. 4: {},
  252. }
  253. }
  254. for _, n := range []int{-1, 0, 1, 2, 3, 4} {
  255. num := 1
  256. if n >= 0 {
  257. num = from.RoomData.Pkg.Layout[n]
  258. }
  259. if n == 1 && num > 1 {
  260. num = num - 1
  261. }
  262. spaceN := 1
  263. if n >= 0 {
  264. spaceN = len(context.Pkg.RoomData.Space[n])
  265. }
  266. if spaceN > len(from.RegionData[n]) {
  267. spaceN = len(from.RegionData[n])
  268. }
  269. context.SpaceType = n
  270. for index := 0; index < spaceN; index++ {
  271. if n < 0 {
  272. context.Space = Space{Area: context.Pkg.RoomData.Pkg.Area}
  273. } else {
  274. context.Space = context.Pkg.RoomData.Space[n][index]
  275. }
  276. context.SpaceIndex = index
  277. for typ := range from.RegionData[n][index] {
  278. region := from.RegionData[n][index][typ]
  279. default_ := false
  280. suppliers := Regions[n][typ].Suppliers(context)
  281. if suppliers != nil {
  282. mat := context.GetMat(region.Material)
  283. if mat == nil {
  284. default_ = true
  285. } else {
  286. inSupplier := false
  287. for _, supplier := range suppliers {
  288. if supplier == mat.SupplierId {
  289. inSupplier = true
  290. break
  291. }
  292. }
  293. if !inSupplier {
  294. default_ = true
  295. }
  296. }
  297. }
  298. if !default_ && Regions[n][typ].DefaultCalc != nil {
  299. defau, _ := Regions[n][typ].DefaultCalc(context)
  300. default_ = defau
  301. }
  302. if context.oldRoomData.Pkg.Type != from.RoomData.Pkg.Type || default_ {
  303. material := int64(0)
  304. materialName := ""
  305. if Regions[n][typ].DefaultMaterialCalc != nil {
  306. materia, _ := Regions[n][typ].DefaultMaterialCalc(context)
  307. material = materia
  308. } else {
  309. if Regions[n][typ].DefaultMaterial != nil {
  310. material = Regions[n][typ].DefaultMaterial[from.RoomData.Pkg.Type]
  311. }
  312. }
  313. mat := context.GetMat(material)
  314. if mat != nil {
  315. materialName = mat.Brand + " " + mat.Series + " " + mat.Model + " " + mat.Specs + " " + mat.Color
  316. }
  317. region.Material = material
  318. region.MaterialName = materialName
  319. from.RegionData[n][index][typ] = region
  320. }
  321. }
  322. }
  323. for m := len(from.RegionData[n]); m < num; m++ {
  324. if n < 0 {
  325. context.Space = Space{Area: context.Pkg.RoomData.Pkg.Area}
  326. } else {
  327. context.Space = context.Pkg.RoomData.Space[n][m]
  328. }
  329. context.SpaceIndex = m
  330. regions := make(map[int]Region)
  331. for i, region := range Regions[n] {
  332. material := int64(0)
  333. materialName := ""
  334. if region.DefaultMaterialCalc != nil {
  335. materia, _ := region.DefaultMaterialCalc(context)
  336. material = materia
  337. } else {
  338. if region.DefaultMaterial != nil {
  339. material = region.DefaultMaterial[from.RoomData.Pkg.Type]
  340. }
  341. }
  342. mat := context.GetMat(material)
  343. if mat != nil {
  344. materialName = mat.Brand + " " + mat.Series + " " + mat.Model + " " + mat.Specs + " " + mat.Color
  345. }
  346. regions[i] = Region{
  347. Material: material,
  348. MaterialName: materialName,
  349. Brand: region.DefaultBrand[from.RoomData.Pkg.Type],
  350. Series: region.DefaultSeries[from.RoomData.Pkg.Type],
  351. }
  352. }
  353. from.RegionData[n] = append(from.RegionData[n], regions)
  354. }
  355. for m := len(from.DeductionData[n]); m < num; m++ {
  356. from.DeductionData[n] = append(from.DeductionData[n], []int{})
  357. }
  358. from.RegionData[n] = from.RegionData[n][:num]
  359. from.DeductionData[n] = from.DeductionData[n][:num]
  360. }
  361. context.Space = Space{}
  362. context.SpaceType = 0
  363. context.SpaceIndex = 0
  364. }
  365. func (from *PkgForm) Load(pkgId int64, content []byte) error {
  366. if len(content) != 0 {
  367. gzJson := bytes.NewBuffer(content)
  368. gz, err := gzip.NewReader(gzJson)
  369. if err != nil {
  370. return err
  371. }
  372. defer gz.Close()
  373. jsonData, err := ioutil.ReadAll(gz)
  374. if err != nil {
  375. return err
  376. }
  377. decoder := json.NewDecoder(strings.NewReader(string(jsonData)))
  378. decoder.UseNumber()
  379. err = decoder.Decode(from)
  380. if err != nil {
  381. return err
  382. }
  383. /*err = json.Unmarshal(jsonData, from)
  384. if err != nil {
  385. return nil, err
  386. }*/
  387. } else {
  388. return from.Init(pkgId, 0, nil)
  389. }
  390. return nil
  391. }
  392. func (from *PkgForm) Content() ([]byte, error) {
  393. jsonData, err := json.Marshal(from)
  394. if err != nil {
  395. return nil, err
  396. }
  397. var gzJson bytes.Buffer
  398. gz := gzip.NewWriter(&gzJson)
  399. if _, err := gz.Write(jsonData); err != nil {
  400. return nil, err
  401. }
  402. if err := gz.Close(); err != nil {
  403. return nil, err
  404. }
  405. return gzJson.Bytes(), nil
  406. }
  407. func (from *PkgForm) ReturnResult(statistics []string) interface{} {
  408. return from.Return(statistics)
  409. }
  410. func (from *PkgForm) Return(statistics []string) (pkgReturn PkgReturn) {
  411. context := from.NewContext()
  412. context.oldRoomData = from.RoomData
  413. pkgReturn.RoomData = from.RoomData
  414. pkgReturn.RegionData = make(RegionReturns)
  415. pkgReturn.BuildItems = make([]BuildItemReturn, 0)
  416. pkgReturn.ContractData = from.ContractData
  417. for roomType, roomRegions := range from.RegionData {
  418. pkgReturn.RegionData[roomType] = make([][]RegionReturn, 0)
  419. context.SpaceType = roomType
  420. for index, regions := range roomRegions {
  421. context.SpaceIndex = index
  422. if roomType < 0 {
  423. context.Space = Space{Area: from.RoomData.Pkg.Area}
  424. } else {
  425. context.Space = from.RoomData.Space[roomType][index]
  426. }
  427. rs := make([]RegionReturn, 0)
  428. for n, regionObject := range Regions[roomType] {
  429. if region, ok := regions[n]; ok {
  430. context.Region = region
  431. if regionObject.Show(context) {
  432. rs = append(rs, RegionReturn{
  433. Name: regionObject.Name,
  434. MaterialName: region.MaterialName,
  435. Type: regionObject.Type,
  436. BrandList: regionObject.Brand,
  437. SeriesList: regionObject.Series,
  438. Material: region.Material,
  439. Brand: region.Brand,
  440. Series: region.Series,
  441. Index: n,
  442. Note: regionObject.Note,
  443. ControlPrice: regionObject.ControlPrice[from.RoomData.Pkg.Type],
  444. Convert: regionObject.Convert,
  445. Convert1: regionObject.Convert1,
  446. Unit: regionObject.Unit,
  447. Suppliers: regionObject.Suppliers(context),
  448. })
  449. }
  450. }
  451. }
  452. pkgReturn.RegionData[roomType] = append(pkgReturn.RegionData[roomType], rs)
  453. }
  454. }
  455. pkgReturn.BuildBudget = from.BuildBudget
  456. statisticMap := make(map[string]int)
  457. for _, statistic := range statistics {
  458. ss := strings.Split(statistic, ",")
  459. for _, s := range ss {
  460. statisticMap[s] = statisticMap[s] + 1
  461. }
  462. }
  463. statisticss := make(map[int][]BuildItemReturn)
  464. for _, item := range BuildItems {
  465. if item.Price != 0 {
  466. if _, ok := statisticss[statisticMap[item.Name]]; !ok {
  467. statisticss[statisticMap[item.Name]] = make([]BuildItemReturn, 0)
  468. }
  469. statisticss[statisticMap[item.Name]] = append(statisticss[statisticMap[item.Name]], BuildItemReturn{
  470. Name: item.Name,
  471. Type: item.Type,
  472. Price: item.Price,
  473. Unit: item.Unit,
  474. Remark: item.Remark,
  475. })
  476. }
  477. }
  478. ss := make([]int, 0)
  479. for s := range statisticss {
  480. ss = append(ss, s)
  481. }
  482. sort.Ints(ss)
  483. sort.Sort(sort.Reverse(sort.IntSlice(ss)))
  484. for _, s := range ss {
  485. pkgReturn.BuildItems = append(pkgReturn.BuildItems, statisticss[s]...)
  486. }
  487. return
  488. }
  489. func (from *PkgForm) UpdateRegion(region RegionFrom) error {
  490. context := from.NewContext()
  491. materialName := ""
  492. if region.Material != 0 {
  493. mat := context.GetMat(region.Material)
  494. if mat != nil {
  495. materialName = mat.Brand + " " + mat.Series + " " + mat.Model + " " + mat.Specs + " " + mat.Color
  496. }
  497. }
  498. from.RegionData[region.SpaceType][region.SpaceIndex][region.Index] = Region{
  499. Material: region.Material,
  500. MaterialName: materialName,
  501. Brand: region.Brand,
  502. Series: region.Series,
  503. }
  504. context.oldRoomData = from.RoomData
  505. return from.CalcInContext(context)
  506. }
  507. func (from *PkgForm) UpdateContractData(contractData ContractData) error {
  508. from.ContractData = contractData
  509. if from.ContractData.Discount < 0 {
  510. from.ContractData.Discount = 0
  511. }
  512. if from.ContractData.Discount > 1 {
  513. from.ContractData.Discount = 1
  514. }
  515. return from.Calc()
  516. }
  517. func (from *PkgForm) AddBuildAdditionalItem(item BuildAdditionalItem) error {
  518. from.AdditionalData.Builds = append(from.AdditionalData.Builds, item)
  519. return from.Calc()
  520. }
  521. type EditAdditionalItem struct {
  522. Index int `json:"index"`
  523. Number float64 `json:"number"`
  524. }
  525. func (from *PkgForm) EditBuildAdditionalItem(item EditAdditionalItem) error {
  526. if len(from.AdditionalData.Builds) > item.Index {
  527. from.AdditionalData.Builds[item.Index].Number = item.Number
  528. }
  529. return from.Calc()
  530. }
  531. func (from *PkgForm) DelBuildAdditionalItem(item EditAdditionalItem) error {
  532. from.AdditionalData.Builds = append(from.AdditionalData.Builds[:item.Index], from.AdditionalData.Builds[item.Index+1:]...)
  533. return from.Calc()
  534. }
  535. func (from *PkgForm) AddMaterialAdditionalItem(item MaterialAdditionalItem) error {
  536. from.AdditionalData.Materials = append(from.AdditionalData.Materials, item)
  537. return from.Calc()
  538. }
  539. type EditMaterialAdditionalItem struct {
  540. Index int `json:"index"`
  541. Number float64 `json:"number"`
  542. Purchase bool `json:"purchase"`
  543. }
  544. func (from *PkgForm) EditMaterialAdditionalItem(item EditMaterialAdditionalItem) error {
  545. if len(from.AdditionalData.Materials) > item.Index {
  546. from.AdditionalData.Materials[item.Index].Number = item.Number
  547. from.AdditionalData.Materials[item.Index].Purchase = item.Purchase
  548. }
  549. return from.Calc()
  550. }
  551. func (from *PkgForm) DelMaterialAdditionalItem(item EditAdditionalItem) error {
  552. from.AdditionalData.Materials = append(from.AdditionalData.Materials[:item.Index], from.AdditionalData.Materials[item.Index+1:]...)
  553. return from.Calc()
  554. }
  555. type Deductionitem struct {
  556. SpaceType int `json:"space_type"`
  557. SpaceIndex int `json:"space_index"`
  558. Index int `json:"index"`
  559. }
  560. func (from *PkgForm) AddDeductionItem(item Deductionitem) error {
  561. if _, ok := from.DeductionData[item.SpaceType]; ok {
  562. if len(from.DeductionData[item.SpaceType]) > item.SpaceIndex {
  563. have := false
  564. for _, d := range from.DeductionData[item.SpaceType][item.SpaceIndex] {
  565. if d == item.Index {
  566. have = true
  567. break
  568. }
  569. }
  570. if !have {
  571. from.DeductionData[item.SpaceType][item.SpaceIndex] = append(from.DeductionData[item.SpaceType][item.SpaceIndex], item.Index)
  572. }
  573. }
  574. }
  575. return from.Calc()
  576. }
  577. func (from *PkgForm) DelDeductionItem(item Deductionitem) error {
  578. if _, ok := from.DeductionData[item.SpaceType]; ok {
  579. if len(from.DeductionData[item.SpaceType]) > item.SpaceIndex {
  580. for n, d := range from.DeductionData[item.SpaceType][item.SpaceIndex] {
  581. if d == item.Index {
  582. from.DeductionData[item.SpaceType][item.SpaceIndex] = append(from.DeductionData[item.SpaceType][item.SpaceIndex][:n], from.DeductionData[item.SpaceType][item.SpaceIndex][n+1:]...)
  583. break
  584. }
  585. }
  586. }
  587. }
  588. return from.Calc()
  589. }
  590. func (from *PkgForm) AddSpecialProjectItem(item SpecialProjectItem) error {
  591. from.AdditionalData.Specials = append(from.AdditionalData.Specials, item)
  592. return from.Calc()
  593. }
  594. type EditSpecialProjectItem struct {
  595. Index int `json:"index"`
  596. Name string `json:"name"`
  597. Type int `json:"type"`
  598. Number float64 `json:"number"`
  599. Price float64 `json:"price"`
  600. Unit string `json:"unit"`
  601. Remark string `json:"remark"`
  602. }
  603. func (from *PkgForm) EditSpecialProjectItem(item EditSpecialProjectItem) error {
  604. if len(from.AdditionalData.Specials) > item.Index {
  605. from.AdditionalData.Specials[item.Index].Name = item.Name
  606. from.AdditionalData.Specials[item.Index].Type = item.Type
  607. from.AdditionalData.Specials[item.Index].Number = item.Number
  608. from.AdditionalData.Specials[item.Index].Price = item.Price
  609. from.AdditionalData.Specials[item.Index].Unit = item.Unit
  610. from.AdditionalData.Specials[item.Index].Remark = item.Remark
  611. }
  612. return from.Calc()
  613. }
  614. func (from *PkgForm) DelSpecialProjectItem(item EditSpecialProjectItem) error {
  615. from.AdditionalData.Specials = append(from.AdditionalData.Specials[:item.Index], from.AdditionalData.Specials[item.Index+1:]...)
  616. return from.Calc()
  617. }
  618. func (from *PkgForm) Handle(c *gin.Context, name string) error {
  619. switch name {
  620. case "UpdateData":
  621. var form RoomData
  622. if app.Bind(c, &form) != nil {
  623. return errors.New("参数错误")
  624. }
  625. return from.UpdateData(form)
  626. case "UpdateContractData":
  627. var form ContractData
  628. if app.Bind(c, &form) != nil {
  629. return errors.New("参数错误")
  630. }
  631. return from.UpdateContractData(form)
  632. case "UpdateRegion":
  633. var form RegionFrom
  634. if app.Bind(c, &form) != nil {
  635. return errors.New("参数错误")
  636. }
  637. return from.UpdateRegion(form)
  638. case "AddBuildAdditionalItem":
  639. var form BuildAdditionalItem
  640. if app.Bind(c, &form) != nil {
  641. return errors.New("参数错误")
  642. }
  643. return from.AddBuildAdditionalItem(form)
  644. case "EditBuildAdditionalItem":
  645. var form EditAdditionalItem
  646. if app.Bind(c, &form) != nil {
  647. return errors.New("参数错误")
  648. }
  649. return from.EditBuildAdditionalItem(form)
  650. case "DelBuildAdditionalItem":
  651. var form EditAdditionalItem
  652. if app.Bind(c, &form) != nil {
  653. return errors.New("参数错误")
  654. }
  655. return from.DelBuildAdditionalItem(form)
  656. case "AddMaterialAdditionalItem":
  657. var form MaterialAdditionalItem
  658. if app.Bind(c, &form) != nil {
  659. return errors.New("参数错误")
  660. }
  661. return from.AddMaterialAdditionalItem(form)
  662. case "EditMaterialAdditionalItem":
  663. var form EditMaterialAdditionalItem
  664. if app.Bind(c, &form) != nil {
  665. return errors.New("参数错误")
  666. }
  667. return from.EditMaterialAdditionalItem(form)
  668. case "DelMaterialAdditionalItem":
  669. var form EditAdditionalItem
  670. if app.Bind(c, &form) != nil {
  671. return errors.New("参数错误")
  672. }
  673. return from.DelMaterialAdditionalItem(form)
  674. case "AddDeductionItem":
  675. var form Deductionitem
  676. if app.Bind(c, &form) != nil {
  677. return errors.New("参数错误")
  678. }
  679. return from.AddDeductionItem(form)
  680. case "DelDeductionItem":
  681. var form Deductionitem
  682. if app.Bind(c, &form) != nil {
  683. return errors.New("参数错误")
  684. }
  685. return from.DelDeductionItem(form)
  686. case "AddSpecialProjectItem":
  687. var form SpecialProjectItem
  688. if app.Bind(c, &form) != nil {
  689. return errors.New("参数错误")
  690. }
  691. return from.AddSpecialProjectItem(form)
  692. case "EditSpecialProjectItem":
  693. var form EditSpecialProjectItem
  694. if app.Bind(c, &form) != nil {
  695. return errors.New("参数错误")
  696. }
  697. return from.EditSpecialProjectItem(form)
  698. case "DelSpecialProjectItem":
  699. var form EditSpecialProjectItem
  700. if app.Bind(c, &form) != nil {
  701. return errors.New("参数错误")
  702. }
  703. return from.DelSpecialProjectItem(form)
  704. }
  705. return errors.New("找不到操作")
  706. }
  707. func (from *PkgForm) Export(siteId int64) (string, error) {
  708. var site final.FinalSite
  709. db.GetModel(map[string]interface{}{"id": siteId}, &site)
  710. var designer models.Admin
  711. db.GetModel(map[string]interface{}{"id": site.DesignerId}, &designer)
  712. types := map[int]string{A10: "1房1价A10套餐", A8: "1房1价A8套餐", A5: "1房1价A5套餐", ZZ1_0: "整装1.0"}
  713. template, err := excelize.OpenFile("2024志远1房1价套餐预算模板.xlsx")
  714. if err != nil {
  715. return "", err
  716. }
  717. for _, sheet := range template.GetSheetList() {
  718. addRows := 0
  719. err = XlsxSetCellValue(template, sheet, 1, 1+addRows, "2024年志远\""+types[from.RoomData.Pkg.Type]+"\"工程预算书(南昌)")
  720. if err != nil {
  721. return "", err
  722. }
  723. worksite := site.Village + site.RoomNo
  724. if worksite == "" {
  725. worksite = site.Address
  726. }
  727. err = XlsxSetCellValue(template, sheet, 1, 2+addRows, "客 户:"+site.Username+" 联系电话:"+site.Phone+" 工程地址:"+worksite)
  728. if err != nil {
  729. return "", err
  730. }
  731. err = XlsxSetCellValue(template, sheet, 1, 3+addRows, "房 型:("+db.ToString(from.RoomData.Pkg.Layout[0])+")房("+db.ToString(from.RoomData.Pkg.Layout[1])+")厅("+db.ToString(from.RoomData.Pkg.Layout[2])+")厨("+db.ToString(from.RoomData.Pkg.Layout[3])+")卫("+db.ToString(from.RoomData.Pkg.Layout[4])+")阳台 外框面积:"+db.ToString(from.RoomData.Pkg.Area)+"㎡ 设计师:"+db.ToString(designer.Username))
  732. if err != nil {
  733. return "", err
  734. }
  735. spaceTypes := map[int]string{
  736. 0: "房间",
  737. 1: "客餐厅",
  738. 2: "厨房",
  739. 3: "卫生间",
  740. 4: "阳台",
  741. }
  742. type AreaData struct {
  743. Name string
  744. Value float64
  745. }
  746. Areas1 := make([]AreaData, 0)
  747. Areas2 := make([]AreaData, 0)
  748. Areas3 := make([]AreaData, 0)
  749. for _, spaceType := range []int{1, 2, 0, 3, 4} {
  750. spaces := from.RoomData.Space[spaceType]
  751. for spaceIndex, space := range spaces {
  752. spaceName := spaceTypes[spaceType]
  753. if len(spaces) > 1 {
  754. spaceName += db.ToString(spaceIndex + 1)
  755. }
  756. areas := []AreaData{{
  757. Name: spaceName + "面积",
  758. Value: space.Area,
  759. }, {
  760. Name: spaceName + "周长",
  761. Value: space.Perimeter,
  762. }}
  763. if spaceType == 3 {
  764. Areas2 = append(Areas2, areas...)
  765. } else if spaceType == 4 {
  766. Areas3 = append(Areas3, areas...)
  767. } else {
  768. Areas1 = append(Areas1, areas...)
  769. }
  770. }
  771. }
  772. areas2Col := 4
  773. if len(Areas3) == 0 {
  774. areas2Col = 6
  775. }
  776. addLine := int(math.Max(math.Max(math.Ceil(float64(len(Areas1))/float64(areas2Col)), math.Ceil(float64(len(Areas2))/2)), math.Ceil(float64(len(Areas3))/2)) - 3)
  777. if addLine > 0 {
  778. for n := 0; n < addLine; n++ {
  779. err := XlsxInsertRow(template, sheet, 6+addRows)
  780. if err != nil {
  781. return "", err
  782. }
  783. }
  784. }
  785. for i, area := range Areas1 {
  786. row := int(float64(i) / float64(areas2Col))
  787. col := (i - int(row)*areas2Col) * 2
  788. err = XlsxSetCellValue(template, sheet, 1+col, 4+addRows+row, area.Name)
  789. if err != nil {
  790. return "", err
  791. }
  792. err = XlsxSetCellValue(template, sheet, 2+col, 4+addRows+row, area.Value)
  793. if err != nil {
  794. return "", err
  795. }
  796. }
  797. for i, area := range Areas2 {
  798. row := int(float64(i) / 2)
  799. col := (i - int(row)*2) * 2
  800. err = XlsxSetCellValue(template, sheet, 1+col+areas2Col*2, 4+addRows+row, area.Name)
  801. if err != nil {
  802. return "", err
  803. }
  804. err = XlsxSetCellValue(template, sheet, 2+col+areas2Col*2, 4+addRows+row, area.Value)
  805. if err != nil {
  806. return "", err
  807. }
  808. }
  809. for i, area := range Areas3 {
  810. row := int(float64(i) / 2)
  811. col := (i - int(row)*2) * 2
  812. err = XlsxSetCellValue(template, sheet, 3+col+areas2Col*2, 4+addRows+row, area.Name)
  813. if err != nil {
  814. return "", err
  815. }
  816. err = XlsxSetCellValue(template, sheet, 4+col+areas2Col*2, 4+addRows+row, area.Value)
  817. if err != nil {
  818. return "", err
  819. }
  820. }
  821. if addLine > 0 {
  822. addRows += addLine
  823. }
  824. err = XlsxSetCellValue(template, sheet, 1, 15+addRows, ""+types[from.RoomData.Pkg.Type]+"预算")
  825. if err != nil {
  826. return "", err
  827. }
  828. err = XlsxSetRow(template, sheet, 16+addRows, []interface{}{"", 1, "", "", types[from.RoomData.Pkg.Type], "房", 1, from.BuildBudget.Contract.PkgPrice, "", from.BuildBudget.Contract.PkgPrice, "内容详见《2024年志远" + types[from.RoomData.Pkg.Type] + "产品说明表》"})
  829. if err != nil {
  830. return "", err
  831. }
  832. err = XlsxSetCellValue(template, sheet, 8, 17+addRows, from.BuildBudget.Contract.PkgTotal)
  833. if err != nil {
  834. return "", err
  835. }
  836. addLine = len(from.BuildBudget.MaterialAdditionalItems) - 1
  837. if addLine > 0 {
  838. for n := 0; n < addLine; n++ {
  839. err := template.DuplicateRow(sheet, 20+addRows)
  840. if err != nil {
  841. return "", err
  842. }
  843. }
  844. }
  845. if addLine < 0 {
  846. template.RemoveRow(sheet, 20+addRows)
  847. }
  848. for i, item := range from.BuildBudget.MaterialAdditionalItems {
  849. err = XlsxSetRow(template, sheet, 20+addRows+i, []interface{}{"", i + 1, "", "", item.Name, item.Unit, item.Number, item.Price, "", item.Total, item.Remark})
  850. if err != nil {
  851. return "", err
  852. }
  853. }
  854. addRows += addLine
  855. err = XlsxSetCellValue(template, sheet, 10, 21+addRows, from.BuildBudget.Contract.MaterialTotal)
  856. if err != nil {
  857. return "", err
  858. }
  859. addLine = len(from.BuildBudget.BuildAdditionalItems) - 1
  860. if addLine > 0 {
  861. for n := 0; n < addLine; n++ {
  862. err := template.DuplicateRow(sheet, 23+addRows)
  863. if err != nil {
  864. return "", err
  865. }
  866. }
  867. }
  868. if addLine < 0 {
  869. template.RemoveRow(sheet, 23+addRows)
  870. }
  871. for i, item := range from.BuildBudget.BuildAdditionalItems {
  872. err = XlsxSetRow(template, sheet, 23+addRows+i, []interface{}{"", i + 1, "", "", item.Name, item.Unit, item.Number, item.Price, "", item.Total, item.Remark})
  873. if err != nil {
  874. return "", err
  875. }
  876. }
  877. addRows += addLine
  878. err = XlsxSetCellValue(template, sheet, 10, 24+addRows, from.BuildBudget.PersonalBuildCost.Direct)
  879. if err != nil {
  880. return "", err
  881. }
  882. err = XlsxSetCellValue(template, sheet, 10, 25+addRows, from.BuildBudget.Contract.PersonalAmount)
  883. if err != nil {
  884. return "", err
  885. }
  886. err = XlsxSetCellValue(template, sheet, 10, 26+addRows, from.BuildBudget.Contract.PersonalTransport)
  887. if err != nil {
  888. return "", err
  889. }
  890. err = XlsxSetCellValue(template, sheet, 10, 27+addRows, from.BuildBudget.Contract.PersonalSanitation)
  891. if err != nil {
  892. return "", err
  893. }
  894. err = XlsxSetCellValue(template, sheet, 10, 28+addRows, from.BuildBudget.Contract.PersonalManage)
  895. if err != nil {
  896. return "", err
  897. }
  898. err = XlsxSetCellValue(template, sheet, 10, 29+addRows, from.BuildBudget.Contract.PersonalTotal)
  899. if err != nil {
  900. return "", err
  901. }
  902. err = XlsxSetCellValue(template, sheet, 7, 30+addRows, from.RoomData.Pkg.Area)
  903. if err != nil {
  904. return "", err
  905. }
  906. err = XlsxSetCellValue(template, sheet, 8, 30+addRows, from.ContractData.Chart)
  907. if err != nil {
  908. return "", err
  909. }
  910. err = XlsxSetCellValue(template, sheet, 10, 30+addRows, from.BuildBudget.Contract.ChartPrice)
  911. if err != nil {
  912. return "", err
  913. }
  914. err = XlsxSetCellValue(template, sheet, 7, 31+addRows, from.RoomData.Pkg.Area)
  915. if err != nil {
  916. return "", err
  917. }
  918. err = XlsxSetCellValue(template, sheet, 8, 31+addRows, from.ContractData.Design)
  919. if err != nil {
  920. return "", err
  921. }
  922. err = XlsxSetCellValue(template, sheet, 10, 31+addRows, from.BuildBudget.Contract.DesignPrice)
  923. if err != nil {
  924. return "", err
  925. }
  926. err = XlsxSetCellValue(template, sheet, 10, 32+addRows, from.BuildBudget.Contract.DirectTotal)
  927. if err != nil {
  928. return "", err
  929. }
  930. err = XlsxSetCellValue(template, sheet, 10, 33+addRows, from.BuildBudget.Contract.DirectCost)
  931. if err != nil {
  932. return "", err
  933. }
  934. addLine = len(from.BuildBudget.MaterialPurchaseItems) - 1
  935. if addLine > 0 {
  936. for n := 0; n < addLine; n++ {
  937. err := template.DuplicateRow(sheet, 36+addRows)
  938. if err != nil {
  939. return "", err
  940. }
  941. }
  942. }
  943. if addLine < 0 {
  944. template.RemoveRow(sheet, 36+addRows)
  945. }
  946. for i, item := range from.BuildBudget.MaterialPurchaseItems {
  947. err = XlsxSetRow(template, sheet, 36+addRows+i, []interface{}{"", i + 1, "", "", item.Name, item.Unit, item.Number, item.Price, "", item.Total, item.Remark})
  948. if err != nil {
  949. return "", err
  950. }
  951. }
  952. addRows += addLine
  953. err = XlsxSetCellValue(template, sheet, 10, 37+addRows, from.BuildBudget.Contract.MaterialPurchaseTotal)
  954. if err != nil {
  955. return "", err
  956. }
  957. addLine = len(from.BuildBudget.BuildSpecialItems) - 1
  958. if addLine > 0 {
  959. for n := 0; n < addLine; n++ {
  960. err := template.DuplicateRow(sheet, 39+addRows)
  961. if err != nil {
  962. return "", err
  963. }
  964. }
  965. }
  966. if addLine < 0 {
  967. template.RemoveRow(sheet, 39+addRows)
  968. }
  969. for i, item := range from.BuildBudget.BuildSpecialItems {
  970. err = XlsxSetRow(template, sheet, 39+addRows+i, []interface{}{"", i + 1, "", "", item.Name, item.Unit, item.Number, item.Price, "", item.Total, item.Remark})
  971. if err != nil {
  972. return "", err
  973. }
  974. }
  975. addRows += addLine
  976. err = XlsxSetCellValue(template, sheet, 10, 40+addRows, from.BuildBudget.Contract.SpecialProjectTotal)
  977. if err != nil {
  978. return "", err
  979. }
  980. err = XlsxSetCellValue(template, sheet, 10, 41+addRows, from.BuildBudget.Contract.PurchaseTotal)
  981. if err != nil {
  982. return "", err
  983. }
  984. err = XlsxSetCellValue(template, sheet, 10, 42+addRows, from.BuildBudget.Contract.Cost)
  985. if err != nil {
  986. return "", err
  987. }
  988. err = XlsxSetCellValue(template, sheet, 10, 43+addRows, from.BuildBudget.Contract.Taxes)
  989. if err != nil {
  990. return "", err
  991. }
  992. err = XlsxSetCellValue(template, sheet, 10, 44+addRows, from.BuildBudget.Contract.CostTotal)
  993. if err != nil {
  994. return "", err
  995. }
  996. addLine = len(from.BuildBudget.MaterialDeductionItems) - 1
  997. if addLine > 0 {
  998. for n := 0; n < addLine; n++ {
  999. err := template.DuplicateRow(sheet, 50+addRows)
  1000. if err != nil {
  1001. return "", err
  1002. }
  1003. }
  1004. }
  1005. if addLine < 0 {
  1006. template.RemoveRow(sheet, 50+addRows)
  1007. }
  1008. for i, item := range from.BuildBudget.MaterialDeductionItems {
  1009. err = XlsxSetRow(template, sheet, 50+addRows+i, []interface{}{"", i + 1, "", "", item.Name, item.Unit, item.Number, item.Price, "", item.Total, item.Remark})
  1010. if err != nil {
  1011. return "", err
  1012. }
  1013. }
  1014. addRows += addLine
  1015. err = XlsxSetCellValue(template, sheet, 10, 51+addRows, from.BuildBudget.Contract.MaterialDeductionTotal)
  1016. if err != nil {
  1017. return "", err
  1018. }
  1019. }
  1020. exportFileName := utils.ToStr(time.Now().UnixNano()) + ".xlsx"
  1021. b, err := template.WriteToBuffer()
  1022. if err != nil {
  1023. return "", err
  1024. }
  1025. f, err := os.Create(config.Cfg.App.ExportPath + exportFileName)
  1026. if err != nil {
  1027. return "", err
  1028. }
  1029. defer f.Close()
  1030. _, _ = b.WriteTo(f)
  1031. return exportFileName, nil
  1032. }
  1033. func (from *PkgForm) UpdateAmount(data map[string]interface{}) map[string]interface{} {
  1034. data["套餐小计"] = from.BuildBudget.Contract.PkgTotal
  1035. data["个性化汇总"] = from.BuildBudget.Contract.PersonalTotal
  1036. data["个性化材料小计"] = from.BuildBudget.Contract.MaterialTotal
  1037. data["个性化施工小计"] = from.BuildBudget.Contract.PersonalBuildTotal
  1038. data["制图费"] = from.BuildBudget.Contract.ChartPrice
  1039. data["设计费"] = from.BuildBudget.Contract.DesignPrice
  1040. data["工程直接费"] = from.BuildBudget.Contract.DirectTotal
  1041. data["工程直接费优惠后金额"] = from.BuildBudget.Contract.DirectCost
  1042. data["主材代购汇总"] = from.BuildBudget.Contract.MaterialPurchaseTotal
  1043. data["特殊项目金额汇总"] = from.BuildBudget.Contract.SpecialProjectTotal
  1044. data["税金"] = from.BuildBudget.Contract.Taxes
  1045. data["减项金额"] = from.BuildBudget.Contract.MaterialDeductionTotal
  1046. data["合同总金额"] = from.BuildBudget.Contract.CostTotal
  1047. return data
  1048. }
  1049. func (from *PkgForm) ManagerPrice() map[string]float64 {
  1050. return map[string]float64{
  1051. "项目监理承包额": from.BuildBudget.PackageAmount,
  1052. "补贴费": from.BuildBudget.SubsidyCollect,
  1053. }
  1054. }
  1055. func (from *PkgForm) BuildControl() map[string]float64 {
  1056. return map[string]float64{
  1057. "拆除": from.BuildBudget.ControlAmount[拆除],
  1058. "水电基础": from.BuildBudget.ControlAmount[水电基础],
  1059. "水电安装": from.BuildBudget.ControlAmount[水电安装],
  1060. "防水": from.BuildBudget.ControlAmount[防水],
  1061. "泥工": from.BuildBudget.ControlAmount[泥工],
  1062. "木工": from.BuildBudget.ControlAmount[木工],
  1063. "油漆工": from.BuildBudget.ControlAmount[油漆],
  1064. "沙石材料": from.BuildBudget.ControlAmount[沙石材料],
  1065. "封包管道": from.BuildBudget.ControlAmount[封包管道],
  1066. "杂费": from.BuildBudget.ControlAmount[杂费],
  1067. "开关面板": from.BuildBudget.ControlAmount[开关面板],
  1068. }
  1069. }
  1070. func (from *PkgForm) AuxiliaryControl() map[string]float64 {
  1071. return map[string]float64{
  1072. "水电材料": from.BuildBudget.ControlAmount[水电材料],
  1073. "木工材料": from.BuildBudget.ControlAmount[木工材料],
  1074. "油漆材料": from.BuildBudget.ControlAmount[油漆材料],
  1075. "开工形象": from.BuildBudget.ControlAmount[开工形象],
  1076. }
  1077. }
  1078. func (from *PkgForm) Materials() map[int64]float64 {
  1079. materials := make(map[int64]float64)
  1080. for _, mss := range from.BuildBudget.Materials {
  1081. for _, ms := range mss {
  1082. for _, m := range ms {
  1083. if m.Material != 0 {
  1084. materials[m.Material] = utils.FloatAdd(materials[m.Material], m.Number, -1)
  1085. }
  1086. }
  1087. }
  1088. }
  1089. return materials
  1090. }
  1091. func (from *PkgForm) Statistics() string {
  1092. items := make([]string, 0)
  1093. for _, build := range from.AdditionalData.Builds {
  1094. items = append(items, build.Item)
  1095. }
  1096. return strings.Join(items, ",")
  1097. }
  1098. func XlsxInsertRow(file *excelize.File, sheet string, row int) error {
  1099. err := file.InsertRows(sheet, row+1, 1)
  1100. if err != nil {
  1101. return err
  1102. }
  1103. height, err := file.GetRowHeight(sheet, row)
  1104. if err != nil {
  1105. return err
  1106. }
  1107. err = file.SetRowHeight(sheet, row+1, height)
  1108. if err != nil {
  1109. return err
  1110. }
  1111. mergeCells, err := file.GetMergeCells(sheet)
  1112. if err != nil {
  1113. return err
  1114. }
  1115. for _, mergeCell := range mergeCells {
  1116. sc, sr, err := excelize.CellNameToCoordinates(mergeCell.GetStartAxis())
  1117. if err != nil {
  1118. return err
  1119. }
  1120. if sr == row {
  1121. ec, er, err := excelize.CellNameToCoordinates(mergeCell.GetEndAxis())
  1122. if err != nil {
  1123. return err
  1124. }
  1125. cell1, _ := excelize.CoordinatesToCellName(sc, sr+1)
  1126. cell2, _ := excelize.CoordinatesToCellName(ec, er+1)
  1127. err = file.MergeCell(sheet, cell1, cell2)
  1128. if err != nil {
  1129. return err
  1130. }
  1131. }
  1132. }
  1133. for n := 1; n <= 20; n++ {
  1134. cell, err := excelize.CoordinatesToCellName(n, row)
  1135. if err != nil {
  1136. return err
  1137. }
  1138. style, err := file.GetCellStyle(sheet, cell)
  1139. if err != nil {
  1140. return err
  1141. }
  1142. cell, err = excelize.CoordinatesToCellName(n, row+1)
  1143. if err != nil {
  1144. return err
  1145. }
  1146. err = file.SetCellStyle(sheet, cell, cell, style)
  1147. if err != nil {
  1148. return err
  1149. }
  1150. }
  1151. return nil
  1152. }
  1153. func XlsxSetCellValue(file *excelize.File, sheet string, col int, row int, value interface{}) error {
  1154. cell, err := excelize.CoordinatesToCellName(col, row)
  1155. if err != nil {
  1156. return err
  1157. }
  1158. err = file.SetCellValue(sheet, cell, value)
  1159. if err != nil {
  1160. return err
  1161. }
  1162. return nil
  1163. }
  1164. func XlsxSetRow(file *excelize.File, sheet string, row int, values []interface{}) error {
  1165. for i, value := range values {
  1166. cell, err := excelize.CoordinatesToCellName(i+1, row)
  1167. if err != nil {
  1168. return err
  1169. }
  1170. err = file.SetCellValue(sheet, cell, value)
  1171. if err != nil {
  1172. return err
  1173. }
  1174. }
  1175. return nil
  1176. }