MonthSaleGoal.vue 61 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464
  1. <template>
  2. <div class="app-container">
  3. <div v-if="isList">
  4. <el-form :model="queryParams" ref="queryForm" size="mini" :inline="true" label-width="100px">
  5. <el-row :gutter="20">
  6. <el-col :span="6">
  7. <el-form-item label="编码" prop="code">
  8. <el-input v-model="queryParams.code" placeholder="请输入编码" clearable @keyup.enter.native="handleQuery" />
  9. </el-form-item>
  10. </el-col>
  11. <el-col :span="6">
  12. <el-form-item label="目标名称" prop="goalName">
  13. <el-input v-model="queryParams.goalName" placeholder="请输入目标名称" clearable
  14. @keyup.enter.native="handleQuery" />
  15. </el-form-item>
  16. </el-col>
  17. <el-col :span="8">
  18. <el-form-item label="单据日期" prop="documentDate">
  19. <el-date-picker v-model="documentDateRange" value-format="yyyy-MM-dd" @change="setBeginAndEnd"
  20. type="daterange" align="right" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"
  21. :picker-options="pickerOptions">
  22. </el-date-picker>
  23. </el-form-item>
  24. </el-col>
  25. <el-col :span="4">
  26. <el-form-item>
  27. <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
  28. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
  29. <el-tooltip class="item" effect="dark" :content="showSearch?'隐藏搜索':'显示搜索'" placement="top">
  30. <el-button type="warning" :icon="showSearch?'el-icon-caret-top':'el-icon-caret-bottom'" circle
  31. @click="showSearch = !showSearch"></el-button>
  32. </el-tooltip>
  33. </el-form-item>
  34. </el-col>
  35. </el-row>
  36. </el-form>
  37. <el-form :model="queryParams" ref="queryForm" size="mini" :inline="true" v-show="showSearch" label-width="100px">
  38. <el-row :gutter="20">
  39. <el-col :span="6">
  40. <el-form-item label="年度" prop="annual">
  41. <el-date-picker v-model="queryParams.annual" type="year" value-format="yyyy" placeholder="选择年度" clearable
  42. @keyup.enter.native="handleQuery">
  43. </el-date-picker>
  44. </el-form-item>
  45. </el-col>
  46. <el-col :span="6">
  47. <el-form-item label="客户" prop="custom" v-if="isDept && !isJiwei">
  48. <el-popover-tree-select v-model="queryParams.custom" valueKey='name' title="客户" referName="PROFITCENTER"
  49. :dataMapping="{ customCode: 'code', custom: 'name'}" :source.sync="queryParams" placeholder="请输入客户"
  50. @keyup.enter.native="handleQuery">
  51. </el-popover-tree-select>
  52. </el-form-item>
  53. <el-form-item label="客户" prop="custom" v-if="!(isDept && !isJiwei)">
  54. <el-popover-select-v2 v-model="queryParams.custom" title="客户" valueKey="name" referName="CUSTOMER_PARAM"
  55. :dataMapping="{ customCode: 'code', custom: 'name'}" :source.sync="queryParams" placeholder="请输入客户"
  56. @keyup.enter.native="handleQuery">
  57. </el-popover-select-v2>
  58. </el-form-item>
  59. </el-col>
  60. <el-col :span="6">
  61. <el-form-item label="销售区域" prop="saleZone">
  62. <el-popover-select-v2 v-model="queryParams.saleZone" title="销售区域" valueKey="name"
  63. referName="MK_SALESAREA_PARAM" :dataMapping="{ saleZoneCode: 'code', saleZone: 'name'}"
  64. :source.sync="queryParams" placeholder="请输入销售区域" @keyup.enter.native="handleQuery">
  65. </el-popover-select-v2>
  66. </el-form-item>
  67. </el-col>
  68. <el-col :span="6">
  69. <el-form-item label="制单人" prop="creator">
  70. <el-popover-select-v2 v-model="queryParams.creator" title="制单人" valueKey="name" referName="CONTACTS_PARAM"
  71. :dataMapping="{ creatorCode: 'code', creator: 'name'}" :source.sync="queryParams" placeholder="请输入制单人"
  72. @keyup.enter.native="handleQuery">
  73. </el-popover-select-v2>
  74. </el-form-item>
  75. </el-col>
  76. </el-row>
  77. <el-row :gutter="20">
  78. <el-col :span="6">
  79. <el-form-item label="部门" prop="dept">
  80. <el-popover-select-v2 v-model="queryParams.dept" title="部门" valueKey="name" referName="DEPT_PARAM"
  81. :dataMapping="{ deptCode: 'id', dept: 'name'}" :source.sync="queryParams" placeholder="请输入部门"
  82. @keyup.enter.native="handleQuery">
  83. </el-popover-select-v2>
  84. </el-form-item>
  85. </el-col>
  86. <el-col :span="6">
  87. <el-form-item label="单据状态" prop="status">
  88. <el-select size="mini" v-model="queryParams.status" clearable>
  89. <el-option v-for="dict in dict.type.sys_status" :key="dict.value" :label="dict.label"
  90. :value="dict.value">
  91. </el-option>
  92. </el-select>
  93. </el-form-item>
  94. </el-col>
  95. </el-row>
  96. </el-form>
  97. <el-row :gutter="10" class="mb8" style="float: right">
  98. <el-col :span="1.5">
  99. <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd">新增
  100. </el-button>
  101. </el-col>
  102. <el-col :span="1.5">
  103. <el-dropdown @command="handleCommand">
  104. <el-button type="warning" plain icon="el-icon-download" size="mini">
  105. 导出<i class="el-icon-arrow-down el-icon--right"></i>
  106. </el-button>
  107. <el-dropdown-menu slot="dropdown">
  108. <el-dropdown-item command="export">导出</el-dropdown-item>
  109. <el-dropdown-item command="exportDetails">导出明细</el-dropdown-item>
  110. </el-dropdown-menu>
  111. </el-dropdown>
  112. </el-col>
  113. </el-row>
  114. <el-table v-loading="loading" :data="monthSaleGoalList" @selection-change="handleSelectionChange"
  115. @row-dblclick="useDoubleClick" v-horizontal-scroll max-height="560">
  116. <el-table-column label="编码" align="center" prop="code" width="180" />
  117. <el-table-column label="目标名称" align="center" prop="goalName" width="240" />
  118. <el-table-column label="单据日期" align="center" prop="documentDate" width="180">
  119. <template slot-scope="scope">
  120. <span>{{ parseTime(scope.row.documentDate, '{y}-{m}-{d}') }}</span>
  121. </template>
  122. </el-table-column>
  123. <el-table-column label="年度" align="center" prop="annual" width="100" />
  124. <el-table-column label="客户" align="center" prop="custom" width="180" />
  125. <el-table-column label="销售区域" align="center" prop="saleZone" width="180" />
  126. <el-table-column label="制单人" align="center" prop="creator" width="180" />
  127. <el-table-column label="部门" align="center" prop="dept" width="180" />
  128. <el-table-column label="销售目标合计(元)" align="center" prop="goalSum" width="180" />
  129. <el-table-column label="备注" align="center" prop="notes" width="180" />
  130. <el-table-column show-overflow-tooltip label="状态" align="center" width="100" prop="status">
  131. <template slot-scope="scope">
  132. <dict-tag :options="dict.type.sys_status" :value="scope.row.status" />
  133. </template>
  134. </el-table-column>
  135. <el-table-column label="操作" align="center" class-name="small-padding" width="180" fixed="right">
  136. <template slot-scope="scope">
  137. <el-button size="mini" type="text" @click="useDoubleClick(scope.row)">查看
  138. </el-button>
  139. <el-button v-if="scope.row.status == '0' || scope.row.status == '3'" size="mini" type="text"
  140. @click="handleUpdate(scope.row)">修改
  141. </el-button>
  142. <el-button v-if="scope.row.status == '0' || scope.row.status == '3'" size="mini" type="text"
  143. @click="handleDelete(scope.row)">删除
  144. </el-button>
  145. <el-button v-if="scope.row.status == '0' || scope.row.status == '3'" size="mini" type="text"
  146. @click="handleSubmit(scope.row)">提交</el-button>
  147. <el-button v-if="scope.row.status == '1'" size="mini" type="text" @click="handleReback(scope.row)">收回
  148. </el-button>
  149. </template>
  150. </el-table-column>
  151. </el-table>
  152. <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
  153. :page-sizes="[10, 20, 50, 100]" @pagination="getList" />
  154. </div>
  155. <!-- <el-drawer :title="title" :visible.sync="open" direction="rtl" :before-close="handleClose" size="100%"
  156. v-horizontal-scroll> -->
  157. <div v-if="!isList">
  158. <el-form ref="form" :model="form" :rules="rules" label-width="120px" :disabled="openStatus == 'see'" size="mini">
  159. <el-row :gutter="20">
  160. <el-col :span="6">
  161. <el-form-item label="编码" prop="code">
  162. <el-input v-model="form.code" placeholder="编码后端自动生成" disabled />
  163. </el-form-item>
  164. </el-col>
  165. <el-col :span="6">
  166. <el-form-item label="目标名称" prop="goalName">
  167. <el-input v-model="form.goalName" placeholder="目标名称后端自动生成" disabled />
  168. </el-form-item>
  169. </el-col>
  170. <el-col :span="6">
  171. <el-form-item label="单据日期" prop="documentDate">
  172. <el-date-picker clearable v-model="form.documentDate" type="date" value-format="yyyy-MM-dd"
  173. @change="setItemMonthly" placeholder="请选择单据日期">
  174. </el-date-picker>
  175. </el-form-item>
  176. </el-col>
  177. <el-col :span="6">
  178. <el-form-item label="年度" prop="annual">
  179. <el-date-picker v-model="form.annual" type="year" value-format="yyyy" placeholder="选择年度">
  180. </el-date-picker>
  181. </el-form-item>
  182. </el-col>
  183. </el-row>
  184. <el-row :gutter="20">
  185. <el-col :span="6">
  186. <el-form-item label="客户" prop="custom" v-if="isDept && !isJiwei">
  187. <el-popover-tree-select v-model="form.custom" valueKey='name' title="客户" referName="PROFITCENTER"
  188. :dataMapping="{ customCode: 'code', custom: 'name'}" :source.sync="form" placeholder="请输入客户">
  189. </el-popover-tree-select>
  190. </el-form-item>
  191. <el-form-item label="客户" prop="custom" v-if="!(isDept && !isJiwei)">
  192. <el-popover-select-v2 v-model="form.custom" title="客户" valueKey="name" referName="CUSTOMER_PARAM"
  193. :dataMapping="{ customCode: 'code', custom: 'name'}" :source.sync="form" placeholder="请输入客户">
  194. </el-popover-select-v2>
  195. </el-form-item>
  196. </el-col>
  197. <el-col :span="6">
  198. <el-form-item label="销售区域" prop="saleZone">
  199. <el-popover-select-v2 v-model="form.saleZone" title="销售区域" valueKey="name" referName="MK_SALESAREA_PARAM"
  200. :dataMapping="{ saleZoneCode: 'code', saleZone: 'name'}" :source.sync="form" placeholder="请输入销售区域">
  201. </el-popover-select-v2>
  202. </el-form-item>
  203. </el-col>
  204. <el-col :span="6">
  205. <el-form-item label="制单人" prop="creator">
  206. <el-popover-select-v2 v-model="form.creator" title="制单人" valueKey="name" referName="CONTACTS_PARAM"
  207. :dataMapping="{ creatorCode: 'code', creator: 'name'}" :source.sync="form" placeholder="请输入制单人">
  208. </el-popover-select-v2>
  209. </el-form-item>
  210. </el-col>
  211. <el-col :span="6">
  212. <el-form-item label="部门" prop="dept">
  213. <el-popover-select-v2 v-model="form.dept" title="部门" valueKey="name" referName="DEPT_PARAM"
  214. :dataMapping="{ deptCode: 'code', dept: 'name'}" :source.sync="form" placeholder="请输入部门">
  215. </el-popover-select-v2>
  216. </el-form-item>
  217. </el-col>
  218. </el-row>
  219. <el-row :gutter="20">
  220. <el-col :span="6">
  221. <el-form-item label="销售目标合计(元)" prop="goalSum" label-width="150px">
  222. <el-input v-model="form.goalSum" placeholder="目标合计自动计算" disabled />
  223. </el-form-item>
  224. </el-col>
  225. <el-col :span="6">
  226. <el-form-item label="备注" prop="notes">
  227. <el-input v-model="form.notes" placeholder="请输入备注" />
  228. </el-form-item>
  229. </el-col>
  230. <el-col :span="6">
  231. <el-form-item label="单据状态" prop="type">
  232. <el-select v-model="form.status" placeholder="" disabled>
  233. <el-option v-for="dict in dict.type.sys_status" :key="dict.value" :label="dict.label"
  234. :value="dict.value"></el-option>
  235. </el-select>
  236. </el-form-item>
  237. </el-col>
  238. <el-col :span="6">
  239. <el-form-item label="时间范围" prop="materialRange">
  240. <el-select v-model="materialRange" placeholder="请选择获取物料的时间范围">
  241. <el-option v-for="item in dateOptions" :key="item.value" :label="item.label" :value="item.value">
  242. </el-option>
  243. </el-select>
  244. </el-form-item>
  245. </el-col>
  246. </el-row>
  247. <div>
  248. <el-row :gutter="10" class="mb8" style="margin-left: 67%">
  249. <el-col :span="1.5">
  250. <el-button type="primary" icon="el-icon-search" size="mini" @click="getMaterialList">查询物料
  251. </el-button>
  252. </el-col>
  253. <el-col :span="1.5">
  254. <el-button type="info" plain icon="el-icon-upload2" size="mini" @click="handleTemplateDownload">模板下载
  255. </el-button>
  256. </el-col>
  257. <el-col :span="1.5">
  258. <el-upload ref="upload" action="" :http-request="handleImport">
  259. <el-button size="mini" type="primary">导入明细</el-button>
  260. </el-upload>
  261. </el-col>
  262. <el-col :span="1.5">
  263. <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAddDetails">增行</el-button>
  264. </el-col>
  265. <el-col :span="1.5">
  266. <el-button type="primary" plain icon="el-icon-edit-outline" size="mini"
  267. @click="dialogUpdateMore.dialogFormVisible = true">批量修改</el-button>
  268. </el-col>
  269. <el-col :span="1.5">
  270. <el-button type="danger" icon="el-icon-delete" size="mini" @click="batchRemove">批量删除</el-button>
  271. </el-col>
  272. </el-row>
  273. <el-tabs v-model="activeName">
  274. <el-tab-pane label="月销售/月利润目标明细" name="monthSaleGoalDetails">
  275. <el-table max-height="560" show-summary :summary-method="getSummaries" v-loading="loading" size="mini"
  276. :data="monthSaleGoalDetailsList" @selection-change="handleSelectionChange" v-horizontal-scroll>
  277. <el-table-column type="selection" width="55" align="center" />
  278. <el-table-column label="序号" type="index" width="70" align="center" fixed />
  279. <!-- <el-table-column label="销售组织" align="center" width="180" :render-header="addRedStar">
  280. <template slot-scope="scope">
  281. <el-popover-select-v2 v-model="monthSaleGoalDetailsList[scope.$index].saleOrg" title="销售组织"
  282. valueKey="name" referName="ORG_PARAM" :dataMapping="{ saleOrgCode: 'code', saleOrg: 'name'}"
  283. :source.sync="monthSaleGoalDetailsList[scope.$index]" placeholder="请输入销售组织">
  284. </el-popover-select-v2>
  285. </template>
  286. </el-table-column>
  287. <el-table-column label="销售区域" align="center" width="180" :render-header="addRedStar">
  288. <template slot-scope="scope">
  289. <el-popover-select-v2 v-model="monthSaleGoalDetailsList[scope.$index].saleZone" title="销售区域"
  290. valueKey="name" referName="MK_SALESAREA_PARAM"
  291. :dataMapping="{ saleZoneCode: 'code', saleZone: 'name'}"
  292. :source.sync="monthSaleGoalDetailsList[scope.$index]" placeholder="请输入销售区域">
  293. </el-popover-select-v2>
  294. </template>
  295. </el-table-column>
  296. <el-table-column label="客户" align="center" width="180" :render-header="addRedStar">
  297. <template slot-scope="scope">
  298. <el-popover-select-v2 v-model="monthSaleGoalDetailsList[scope.$index].custom" title="客户"
  299. valueKey="name" referName="CUSTOMER_PARAM" :dataMapping="{ customCode: 'code', custom: 'name'}"
  300. :source.sync="monthSaleGoalDetailsList[scope.$index]" placeholder="请输入客户">
  301. </el-popover-select-v2>
  302. </template>
  303. </el-table-column>
  304. <el-table-column label="部门" align="center" width="180" :render-header="addRedStar">
  305. <template slot-scope="scope">
  306. <el-popover-select-v2 v-model="monthSaleGoalDetailsList[scope.$index].dept" title="部门"
  307. valueKey="name" referName="DEPT_PARAM" :dataMapping="{ deptCode: 'code', dept: 'name'}"
  308. :source.sync="monthSaleGoalDetailsList[scope.$index]" placeholder="请输入部门">
  309. </el-popover-select-v2>
  310. </template>
  311. </el-table-column>
  312. <el-table-column label="制单人" align="center" width="180" :render-header="addRedStar">
  313. <template slot-scope="scope">
  314. <el-popover-select-v2 v-model="monthSaleGoalDetailsList[scope.$index].creator" title="制单人"
  315. valueKey="name" referName="CONTACTS_PARAM" :dataMapping="{ creatorCode: 'code', creator: 'name'}"
  316. :source.sync="monthSaleGoalDetailsList[scope.$index]" placeholder="请输入制单人">
  317. </el-popover-select-v2>
  318. </template>
  319. </el-table-column> -->
  320. <el-table-column label="一级分类" align="center" min-width="200" :render-header="addRedStar">
  321. <template slot-scope="scope">
  322. <el-select v-model="monthSaleGoalDetailsList[scope.$index].oneLevelClassify" clearable
  323. @focus="chooseTreeReferForMain('MATERIALCLASSIFY_PARAM', false, '一级物料分类', scope.$index)"
  324. :disabled="!isDept">
  325. <el-option v-for="item in classOptions" :key="item.id" :label="item.name" :value="item.code" />
  326. </el-select>
  327. </template>
  328. </el-table-column>
  329. <el-table-column label="二级分类" align="center" min-width="200" :render-header="addRedStar">
  330. <template slot-scope="scope">
  331. <el-select v-model="monthSaleGoalDetailsList[scope.$index].twoLevelClassify" clearable
  332. @focus="chooseTreeReferForMain('MATERIALCLASSIFY_PARAM', false, '二级物料分类', scope.$index)"
  333. :disabled="!isDept">
  334. <el-option v-for="item in classOptions" :key="item.id" :label="item.name" :value="item.code" />
  335. </el-select>
  336. </template>
  337. </el-table-column>
  338. <el-table-column label="物料" align="center" min-width="220" :render-header="addRedStarChange">
  339. <template slot-scope="scope">
  340. <el-tooltip class="item" effect="dark" placement="top-start">
  341. <div slot="content">{{ scope.row.memo }}</div>
  342. <el-popover-select-v2 v-model="monthSaleGoalDetailsList[scope.$index].material" title="物料"
  343. valueKey="name" referName="MATERIAL_PARAM"
  344. @change="setClassify(scope.row.oneLevelClassify, scope.row.twoLevelClassify, monthSaleGoalDetailsList[scope.$index], scope.row)"
  345. :dataMapping="{ materialCode: 'code', material: 'name', oneLevelClassify: 'oneClass', twoLevelClassify: 'twoClass',
  346. specification: 'specification', packExplain: 'packExplain', model: 'model'}"
  347. :source.sync="monthSaleGoalDetailsList[scope.$index]" placeholder="请输入物料">
  348. </el-popover-select-v2>
  349. </el-tooltip>
  350. </template>
  351. </el-table-column>
  352. <el-table-column label="科室" align="center" min-width="200">
  353. <template slot-scope="scope">
  354. <el-select v-model.trim="monthSaleGoalDetailsList[scope.$index].department" placeholder="请选择科室"
  355. filterable>
  356. <el-option v-for="dict in dict.type.mk_bo_section" :key="dict.value" :label="dict.label"
  357. :value="dict.value"></el-option>
  358. </el-select>
  359. </template>
  360. </el-table-column>
  361. <el-table-column label="数量" align="center" prop="num" min-width="220">
  362. <template slot-scope="scope">
  363. <el-input-number v-model="monthSaleGoalDetailsList[scope.$index].num" :min="0"
  364. @change="calculate(scope.row)"></el-input-number>
  365. </template>
  366. </el-table-column>
  367. <el-table-column label="月份" align="center" min-width="250">
  368. <template slot-scope="scope">
  369. <el-date-picker v-model="monthSaleGoalDetailsList[scope.$index].monthly" value-format="yyyy-MM"
  370. disabled type="month" placeholder="选择月份">
  371. </el-date-picker>
  372. </template>
  373. </el-table-column>
  374. <el-table-column label="销售目标值(元)" align="center" prop="goalValue" min-width="220"
  375. :render-header="addRedStar">
  376. <template slot-scope="scope">
  377. <el-input-number @change="computeTotal" v-model="monthSaleGoalDetailsList[scope.$index].goalValue"
  378. :precision="2" :step="1" :min="0"></el-input-number>
  379. </template>
  380. </el-table-column>
  381. <el-table-column label="利润目标值(元)" align="center" prop="profitTargetValue" min-width="220"
  382. :render-header="addRedStar" v-if="isDept">
  383. <template slot-scope="scope">
  384. <el-input-number @change="computeTotal"
  385. v-model="monthSaleGoalDetailsList[scope.$index].profitTargetValue" :precision="2" :step="1"
  386. :min="0"></el-input-number>
  387. </template>
  388. </el-table-column>
  389. <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="120px"
  390. fixed="right">
  391. <template slot-scope="scope">
  392. <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDeleteDetails(scope.row)">删除
  393. </el-button>
  394. <el-button size="mini" type="text" icon="el-icon-delete" @click="handleCopyDetails(scope.row)">复制
  395. </el-button>
  396. </template>
  397. </el-table-column>
  398. </el-table>
  399. </el-tab-pane>
  400. </el-tabs>
  401. <div slot="footer" class="dialog-footer" style="margin-left: 88%; margin-top: 1%">
  402. <el-button type="primary" @click="submitForm" size="medium">确 定</el-button>
  403. <el-button @click="cancel" size="medium" :disabled="false">返 回</el-button>
  404. </div>
  405. </div>
  406. </el-form>
  407. </div>
  408. <!-- </el-drawer> -->
  409. <!-- 用户导入对话框 -->
  410. <el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
  411. <el-upload ref="upload" :limit="1" accept=".xlsx, .xls" :headers="upload.headers"
  412. :action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading"
  413. :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
  414. <i class="el-icon-upload"></i>
  415. <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
  416. <div class="el-upload__tip text-center" slot="tip">
  417. <div class="el-upload__tip" slot="tip">
  418. <el-checkbox v-model="upload.updateSupport" /> 是否更新已经存在的用户数据
  419. </div>
  420. <span>仅允许导入xls、xlsx格式文件。</span>
  421. <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;"
  422. @click="importTemplate">下载模板</el-link>
  423. </div>
  424. </el-upload>
  425. <div slot="footer">
  426. <el-button type="primary" @click="submitFileForm">确 定</el-button>
  427. <el-button @click="upload.open = false">取 消</el-button>
  428. </div>
  429. </el-dialog>
  430. <!-- 批量修改对话框-->
  431. <el-dialog title="批量修改" width="30%" :visible.sync="dialogUpdateMore.dialogFormVisible" append-to-body
  432. @closed="resetDialogUpdateMore">
  433. <el-form>
  434. <el-form-item label="修改项" label-width="100px">
  435. <el-select @change="changeDialogData" v-model="dialogUpdateMore.updateName" placeholder="请选择需要批量修改的字段">
  436. <el-option v-for="item in dialogUpdateMore.optionList" :key="item.value" :label="item.label"
  437. :value="item.value"></el-option>
  438. </el-select>
  439. </el-form-item>
  440. <el-form-item label="修改值" label-width="100px">
  441. <el-popover-select-v2 v-if="dialogUpdateMore.updateName === 1" v-model="dialogUpdateMore.updateData"
  442. title="销售组织" valueKey="name" referName="ORG_PARAM" :dataMapping="{updateData: 'name'}"
  443. :source.sync="dialogUpdateMore" placeholder="请输入销售组织">
  444. </el-popover-select-v2>
  445. <el-popover-select-v2 v-else-if="dialogUpdateMore.updateName === 2" v-model="dialogUpdateMore.updateData"
  446. title="销售区域" valueKey="name" referName="MK_SALESAREA_PARAM" :dataMapping="{updateData: 'name'}"
  447. :source.sync="dialogUpdateMore" placeholder="请输入销售区域">
  448. </el-popover-select-v2>
  449. <el-popover-select-v2 v-else-if="dialogUpdateMore.updateName === 3" v-model="dialogUpdateMore.updateData"
  450. title="客户" valueKey="name" referName="CUSTOMER_PARAM" :dataMapping="{updateData: 'name'}"
  451. :source.sync="dialogUpdateMore" placeholder="请输入客户">
  452. </el-popover-select-v2>
  453. <el-popover-select-v2 v-else-if="dialogUpdateMore.updateName === 4" v-model="dialogUpdateMore.updateData"
  454. title="部门" valueKey="name" referName="DEPT_PARAM" :dataMapping="{updateData: 'name'}"
  455. :source.sync="dialogUpdateMore" placeholder="请输入部门">
  456. </el-popover-select-v2>
  457. <el-popover-select-v2 v-else-if="dialogUpdateMore.updateName === 5" v-model="dialogUpdateMore.updateData"
  458. title="制单人" valueKey="name" referName="CONTACTS_PARAM" :dataMapping="{updateData: 'name'}"
  459. :source.sync="dialogUpdateMore" placeholder="请输入制单人">
  460. </el-popover-select-v2>
  461. <el-input v-else-if="dialogUpdateMore.updateName === 6" v-model="dialogUpdateMore.updateData"
  462. placeholder="请输入科室"></el-input>
  463. <el-date-picker v-else-if="dialogUpdateMore.updateName === 7" v-model="dialogUpdateMore.updateData"
  464. value-format="yyyy-MM" type="month" placeholder="选择月">
  465. </el-date-picker>
  466. <el-input v-else placeholder="请输入修改项" disabled></el-input>
  467. </el-form-item>
  468. </el-form>
  469. <div slot="footer" class="dialog-footer">
  470. <el-button type="primary" @click="dialogUpdateMoreSave">确 定</el-button>
  471. </div>
  472. </el-dialog>
  473. <TreeRefers ref="treeMain" @doSubmit="selectionsToInputForMain" :single="true" />
  474. </div>
  475. </template>
  476. <script>
  477. import {
  478. listMonthSaleGoal,
  479. getMonthSaleGoal,
  480. delMonthSaleGoal,
  481. addMonthSaleGoal,
  482. updateMonthSaleGoal,
  483. submit
  484. } from "@/api/business/spd/goal_management/monthSaleGoal";
  485. import {
  486. getMonthSaleGoalDetails,
  487. delMonthSaleGoalDetails,
  488. importData,
  489. getMaterialRangeList,
  490. getDeptIds
  491. } from "@/api/business/spd/goal_management/monthSaleGoalDetails"
  492. import {
  493. getToken
  494. } from "@/utils/auth";
  495. import {
  496. getSummary
  497. } from "../../../../api/business/spd/goal_management/commonWays";
  498. import {
  499. rollBack
  500. } from "@/api/business/spd/goal_management/publicInterface";
  501. // 树形参照
  502. import TreeRefers from '@/components/Refers/treeRefer.vue'
  503. import ElPopoverSelectV2 from "@/components/popover-select-v2"
  504. export default {
  505. name: "MonthSaleGoal",
  506. components: {
  507. TreeRefers,
  508. ElPopoverSelectV2,
  509. ElPopoverTreeSelect: () =>
  510. import("@/components/popover-tree-select/index.vue"),
  511. },
  512. dicts: ["sys_status", "oa_templete_id", "mk_bo_section"],
  513. data() {
  514. return {
  515. // 遮罩层
  516. loading: true,
  517. // 选中数组
  518. ids: [],
  519. // 非单个禁用
  520. single: true,
  521. // 非多个禁用
  522. multiple: true,
  523. // 显示搜索条件
  524. showSearch: false,
  525. // 总条数
  526. total: 0,
  527. // 月销售/月利润目标填报表格数据
  528. monthSaleGoalList: [],
  529. monthSaleGoalDetailsList: [],
  530. delMonthSaleGoalDetailsList: [],
  531. // 弹出层标题
  532. title: "",
  533. // 是否显示弹出层
  534. open: false,
  535. // 查询参数
  536. queryParams: {
  537. pageNum: 1,
  538. pageSize: 10,
  539. code: null,
  540. goalName: null,
  541. documentDate: null,
  542. annual: null,
  543. customCode: null,
  544. custom: null,
  545. saleZoneCode: null,
  546. saleZone: null,
  547. creatorCode: null,
  548. creator: null,
  549. deptCode: null,
  550. dept: null,
  551. goalSum: null,
  552. notes: null,
  553. status: null,
  554. params: {
  555. beginTime: null,
  556. endTime: null
  557. }
  558. },
  559. documentDateRange: null,
  560. pickerOptions: {
  561. shortcuts: [{
  562. text: '最近一周',
  563. onClick(picker) {
  564. const end = new Date();
  565. const start = new Date();
  566. start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
  567. picker.$emit('pick', [start, end]);
  568. }
  569. }, {
  570. text: '最近一个月',
  571. onClick(picker) {
  572. const end = new Date();
  573. const start = new Date();
  574. start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
  575. picker.$emit('pick', [start, end]);
  576. }
  577. }, {
  578. text: '最近三个月',
  579. onClick(picker) {
  580. const end = new Date();
  581. const start = new Date();
  582. start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
  583. picker.$emit('pick', [start, end]);
  584. }
  585. }]
  586. },
  587. // 表单参数
  588. form: {
  589. id: null,
  590. code: null,
  591. goalName: null,
  592. documentDate: null,
  593. annual: null,
  594. customCode: null,
  595. custom: null,
  596. saleZoneCode: null,
  597. saleZone: null,
  598. creatorCode: null,
  599. creator: null,
  600. deptCode: null,
  601. dept: null,
  602. goalSum: null,
  603. notes: null,
  604. status: null,
  605. monthDetailsList: null,
  606. isDept: null
  607. },
  608. formDetails: {
  609. id: null,
  610. code: null,
  611. saleOrg: null,
  612. saleZone: null,
  613. custom: null,
  614. dept: null,
  615. creator: null,
  616. oneLevelClassifyCode: null,
  617. oneLevelClassify: null,
  618. twoLevelClassifyCode: null,
  619. twoLevelClassify: null,
  620. materialCode: null,
  621. specification: null,
  622. packExplain: null,
  623. model: null,
  624. material: null,
  625. department: null,
  626. num: null,
  627. monthly: null,
  628. goalValue: null
  629. },
  630. // 表单校验
  631. rules: {
  632. documentDate: [{
  633. required: true,
  634. message: '单据日期不能为空',
  635. trigger: 'blur'
  636. }],
  637. annual: [{
  638. required: true,
  639. message: '年度不能为空',
  640. trigger: 'blur'
  641. }],
  642. custom: [{
  643. required: true,
  644. message: '客户不能为空',
  645. trigger: 'blur'
  646. }],
  647. saleZone: [{
  648. required: true,
  649. message: '销售区域不能为空',
  650. trigger: 'blur'
  651. }],
  652. creator: [{
  653. required: true,
  654. message: '制单人不能为空',
  655. trigger: 'blur'
  656. }],
  657. dept: [{
  658. required: true,
  659. message: '部门不能为空',
  660. trigger: 'blur'
  661. }]
  662. },
  663. // 子表导航名
  664. activeName: 'monthSaleGoalDetails',
  665. // 用户导入参数
  666. upload: {
  667. // 是否显示弹出层(用户导入)
  668. open: false,
  669. // 弹出层标题(用户导入)
  670. title: "",
  671. // 是否禁用上传
  672. isUploading: false,
  673. // 是否更新已经存在的用户数据
  674. updateSupport: 0,
  675. // 设置上传的请求头部
  676. headers: {
  677. Authorization: "Bearer " + getToken()
  678. },
  679. // 上传的地址
  680. url: process.env.VUE_APP_BASE_API + "/goal_management/monthSaleGoal/importData"
  681. },
  682. dialogUpdateMore: {
  683. updateName: null,
  684. dialogFormVisible: false,
  685. updateData: null,
  686. optionList: [{
  687. value: 1,
  688. label: '销售组织'
  689. }, {
  690. value: 2,
  691. label: '销售区域'
  692. }, {
  693. value: 3,
  694. label: '客户'
  695. }, {
  696. value: 4,
  697. label: '部门'
  698. }, {
  699. value: 5,
  700. label: '制单人'
  701. }, {
  702. value: 6,
  703. label: '科室'
  704. }, {
  705. value: 7,
  706. label: '月份'
  707. }]
  708. },
  709. //打开状态
  710. openStatus: null,
  711. //物料来源时间
  712. dateOptions: [{
  713. value: '0',
  714. label: '近一个月'
  715. }, {
  716. value: '1',
  717. label: '近三个月'
  718. }, {
  719. value: '2',
  720. label: '近半年'
  721. }, {
  722. value: '3',
  723. label: '近一年'
  724. }],
  725. materialRange: '',
  726. text: '',
  727. // 判断操作用户是否属于特殊部门的标志
  728. isDept: false,
  729. // 判断操作用户是否属于基卫销售部的标志
  730. isJiwei: false,
  731. // 物料分类数组
  732. classOptions: [],
  733. // 树形参照
  734. referCondition: {
  735. type: '',
  736. isPage: true,
  737. title: '',
  738. index: null
  739. },
  740. index: null,
  741. // 列表标识
  742. isList: true,
  743. selection: null,
  744. };
  745. },
  746. created() {
  747. this.getList();
  748. this.judge();
  749. },
  750. methods: {
  751. /** 查询月销售/月利润目标填报列表 */
  752. getList() {
  753. this.loading = true;
  754. listMonthSaleGoal(this.queryParams).then(response => {
  755. this.monthSaleGoalList = response.rows;
  756. this.total = response.total;
  757. this.loading = false;
  758. this.monthSaleGoalList.forEach(item => {
  759. item.goalSum = item.goalSum.toFixed(2);
  760. })
  761. });
  762. },
  763. getListDetails() {
  764. this.loading = true
  765. getMonthSaleGoalDetails(this.form.id).then(response => {
  766. this.monthSaleGoalDetailsList = response.data
  767. this.computeTotal()
  768. this.form.monthDetailsList = this.monthSaleGoalDetailsList
  769. updateMonthSaleGoal(this.form).then(response => {})
  770. this.loading = false
  771. })
  772. },
  773. // 取消按钮
  774. cancel() {
  775. this.isList = true;
  776. this.open = false;
  777. this.reset();
  778. },
  779. // 表单重置
  780. reset() {
  781. this.form = {
  782. id: null,
  783. code: null,
  784. goalName: null,
  785. documentDate: null,
  786. annual: null,
  787. customCode: null,
  788. custom: null,
  789. saleZoneCode: null,
  790. saleZone: null,
  791. creatorCode: null,
  792. creator: null,
  793. deptCode: null,
  794. dept: null,
  795. goalSum: null,
  796. notes: null,
  797. status: null,
  798. monthDetailsList: null,
  799. isDept: null
  800. };
  801. this.resetForm("form");
  802. },
  803. /** 搜索按钮操作 */
  804. handleQuery() {
  805. this.queryParams.pageNum = 1;
  806. this.getList();
  807. },
  808. /** 重置按钮操作 */
  809. resetQuery() {
  810. this.queryParams = {
  811. pageNum: 1,
  812. pageSize: 10,
  813. code: null,
  814. goalName: null,
  815. documentDate: null,
  816. annual: null,
  817. customCode: null,
  818. custom: null,
  819. saleZoneCode: null,
  820. saleZone: null,
  821. creatorCode: null,
  822. creator: null,
  823. deptCode: null,
  824. dept: null,
  825. goalSum: null,
  826. notes: null,
  827. status: null,
  828. params: {
  829. beginTime: null,
  830. endTime: null
  831. }
  832. }
  833. this.documentDateRange = null
  834. this.resetForm("queryForm");
  835. this.handleQuery();
  836. },
  837. // 多选框选中数据
  838. handleSelectionChange(selection) {
  839. this.ids = selection.map(item => item.id)
  840. this.single = selection.length !== 1
  841. this.multiple = !selection.length
  842. this.selection = selection
  843. },
  844. /** 新增按钮操作 */
  845. handleAdd() {
  846. this.isList = false;
  847. this.openStatus = 'edit';
  848. this.reset();
  849. this.monthSaleGoalDetailsList = []
  850. this.open = true;
  851. this.title = "添加--月销售/月利润目标填报";
  852. this.form.documentDate = new Date().getFullYear().toString() + '-' + (new Date().getMonth() + 1).toString()
  853. .padStart(2, '0') + '-' + new Date().getDate().toString().padStart(2, '0')
  854. this.form.annual = new Date().getFullYear().toString()
  855. this.form.creatorCode = this.$store.state.user.name
  856. this.form.creator = this.$store.state.user.nickName
  857. this.form.deptId = this.$store.state.user.deptId
  858. this.form.dept = this.$store.state.user.deptName
  859. },
  860. handleAddDetails() {
  861. let list = {
  862. id: null,
  863. code: null,
  864. saleOrg: this.$store.state.user.orgName,
  865. saleZone: this.form.saleZone,
  866. custom: this.form.custom,
  867. dept: this.form.dept,
  868. creator: this.form.creator,
  869. oneLevelClassifyCode: null,
  870. oneLevelClassify: null,
  871. twoLevelClassifyCode: null,
  872. twoLevelClassify: null,
  873. materialCode: null,
  874. specification: null,
  875. packExplain: null,
  876. model: null,
  877. material: null,
  878. department: null,
  879. num: null,
  880. monthly: this.form.documentDate.substring(0, 7),
  881. goalValue: 0,
  882. profitTargetValue: 0,
  883. delFlag: '0',
  884. }
  885. this.monthSaleGoalDetailsList.push(list)
  886. this.computeTotal()
  887. },
  888. /** 修改按钮操作 */
  889. handleUpdate(row) {
  890. this.openStatus = 'edit';
  891. this.reset();
  892. const id = row.id || this.ids
  893. getMonthSaleGoal(id).then(response => {
  894. this.form = response.data;
  895. this.form.goalSum = this.form.goalSum.toFixed(2)
  896. this.monthSaleGoalDetailsList = JSON.parse(JSON.stringify(this.form.monthDetailsList))
  897. this.open = true;
  898. this.isList = false;
  899. this.title = "修改--月销售/月利润目标填报";
  900. });
  901. },
  902. useDoubleClick(row) {
  903. this.openStatus = 'see';
  904. this.reset();
  905. const id = row.id || this.ids
  906. getMonthSaleGoal(id).then(response => {
  907. this.form = response.data;
  908. this.form.goalSum = this.form.goalSum.toFixed(2)
  909. this.monthSaleGoalDetailsList = JSON.parse(JSON.stringify(this.form.monthDetailsList))
  910. this.open = true;
  911. this.isList = false;
  912. this.title = "查看--月销售/月利润目标填报";
  913. });
  914. },
  915. // 复制按钮
  916. handleCopy(id) {
  917. this.openStatus = 'edit';
  918. this.reset();
  919. getMonthSaleGoal(id).then(response => {
  920. this.form = response.data;
  921. this.form.id = null
  922. this.form.code = null
  923. this.form.goalSum = this.form.goalSum.toFixed(2)
  924. this.form.documentDate = new Date().getFullYear().toString() + '-' + (new Date().getMonth() + 1)
  925. .toString().padStart(2, '0') + '-' + new Date().getDate().toString().padStart(2, '0')
  926. this.form.annual = new Date().getFullYear().toString()
  927. this.monthSaleGoalDetailsList = JSON.parse(JSON.stringify(this.form.monthDetailsList))
  928. for (const element of this.monthSaleGoalDetailsList) {
  929. element.id = null
  930. element.code = null
  931. }
  932. this.open = true;
  933. this.title = "新增--月销售/月利润目标填报";
  934. })
  935. },
  936. /** 提交按钮 */
  937. submitForm() {
  938. for (let i = 0; i < this.monthSaleGoalDetailsList.length; i++) {
  939. this.monthSaleGoalDetailsList[i].saleOrg = this.$store.state.user.orgName;
  940. this.monthSaleGoalDetailsList[i].saleZone = this.form.saleZone;
  941. this.monthSaleGoalDetailsList[i].custom = this.form.custom;
  942. this.monthSaleGoalDetailsList[i].dept = this.form.dept;
  943. this.monthSaleGoalDetailsList[i].creator = this.form.creator;
  944. }
  945. console.log(this.form, 'form');
  946. if (this.form.saleZone == null || this.form.saleZone == undefined || this.form.saleZone == '' || this.form
  947. .custom == null || this.form.custom == undefined) {
  948. return this.$message.error('主表中有必填字段未填!')
  949. }
  950. if (this.justiceDetailsList()) {
  951. return this.$message.error('子表中第' + this.text + '行有必填字段未填,或者目标值为0')
  952. }
  953. if (!this.isDept) {
  954. for (let i = 0; i < this.monthSaleGoalDetailsList.length; i++) {
  955. for (let j = i + 1; j < this.monthSaleGoalDetailsList.length - i; j++) {
  956. if (this.monthSaleGoalDetailsList[i].materialCode == this.monthSaleGoalDetailsList[j].materialCode) {
  957. return this.$message.error('子表存在重复物料');
  958. }
  959. }
  960. }
  961. }
  962. this.$refs["form"].validate(valid => {
  963. if (this.isJiwei == true) {
  964. this.form.isDept = '2';
  965. } else if (this.isDept == true && this.isJiwei == false) {
  966. this.form.isDept = '1';
  967. }
  968. if (valid) {
  969. if (this.form.id != null) {
  970. this.form.monthDetailsList = JSON.parse(JSON.stringify(this.monthSaleGoalDetailsList))
  971. let ids = this.delMonthSaleGoalDetailsList.map((item) => {
  972. return item.id;
  973. })
  974. ids = ids.filter((item) => {
  975. return item != null;
  976. })
  977. console.log(ids, 'ids')
  978. this.$modal.loading("保存中...");
  979. updateMonthSaleGoal(this.form).then(response => {
  980. if (ids != null && ids.length != 0) {
  981. delMonthSaleGoalDetails(ids);
  982. }
  983. this.$modal.msgSuccess("修改成功");
  984. this.open = false;
  985. this.isList = true;
  986. this.getList();
  987. }).finally(e => {
  988. this.$modal.closeLoading();
  989. });
  990. } else {
  991. this.form.status = '0'
  992. this.form.monthDetailsList = JSON.parse(JSON.stringify(this.monthSaleGoalDetailsList))
  993. console.log(this.form);
  994. this.$modal.loading("保存中...");
  995. addMonthSaleGoal(this.form).then(response => {
  996. this.$modal.msgSuccess("新增成功");
  997. this.open = false;
  998. this.isList = true;
  999. this.getList();
  1000. }).finally(e => {
  1001. this.$modal.closeLoading();
  1002. });
  1003. }
  1004. }
  1005. });
  1006. },
  1007. /** 删除按钮操作 */
  1008. handleDelete(row) {
  1009. const ids = row.id || this.ids;
  1010. this.$modal.confirm('是否确认删除月销售/月利润目标填报单据编号为"' + row.code + '"的数据项?').then(function () {
  1011. return delMonthSaleGoal(ids);
  1012. }).then(() => {
  1013. this.getList();
  1014. this.$modal.msgSuccess("删除成功");
  1015. }).catch(() => {});
  1016. },
  1017. // 详情页明细行删除
  1018. handleDeleteDetails(row) {
  1019. this.$confirm('是否确认删除?').then(_ => {
  1020. row.delFlag = '2';
  1021. this.delMonthSaleGoalDetailsList.push(row);
  1022. this.monthSaleGoalDetailsList = this.monthSaleGoalDetailsList.filter((item) => {
  1023. return item.delFlag == '0';
  1024. })
  1025. }).catch(_ => {});
  1026. },
  1027. /** 导出按钮操作 */
  1028. handleExport() {
  1029. this.download('goal_management/monthSaleGoal/export', {
  1030. ...this.queryParams
  1031. }, `monthSaleGoal_${new Date().getTime()}.xlsx`)
  1032. },
  1033. handleExportDetails() {
  1034. this.download('goal_management/monthSaleGoalDetails/export', {
  1035. ...this.queryParams
  1036. }, `monthSaleGoalDetails_${new Date().getTime()}.xlsx`)
  1037. },
  1038. handleClose(done) {
  1039. this.$confirm('确认关闭?')
  1040. .then(_ => {
  1041. done();
  1042. })
  1043. .catch(_ => {});
  1044. },
  1045. // 复制明细
  1046. handleCopyDetails(row) {
  1047. let list = {
  1048. id: null,
  1049. code: row.code,
  1050. saleOrg: row.saleOrg,
  1051. saleZone: row.saleZone,
  1052. custom: row.custom,
  1053. dept: row.dept,
  1054. creator: row.creator,
  1055. oneLevelClassifyCode: row.oneLevelClassifyCode,
  1056. oneLevelClassify: row.oneLevelClassify,
  1057. twoLevelClassifyCode: row.twoLevelClassifyCode,
  1058. twoLevelClassify: row.twoLevelClassify,
  1059. materialCode: row.materialCode,
  1060. material: row.material,
  1061. department: row.department,
  1062. num: row.num,
  1063. monthly: row.monthly,
  1064. goalValue: row.goalValue,
  1065. profitTargetValue: row.profitTargetValue
  1066. }
  1067. this.monthSaleGoalDetailsList.push(list)
  1068. this.computeTotal()
  1069. },
  1070. // 计算主表合计
  1071. computeTotal() {
  1072. let list = this.monthSaleGoalDetailsList
  1073. let sum = 0
  1074. for (const listElement of list) {
  1075. sum = (sum * 1000000 + listElement.goalValue * 1000000) / 1000000
  1076. }
  1077. this.form.goalSum = sum.toFixed(2)
  1078. },
  1079. getSummaries(param) {
  1080. return getSummary(param)
  1081. },
  1082. // 子表table加必填标志
  1083. addRedStar(h, {
  1084. column
  1085. }) {
  1086. return [
  1087. h('span', {
  1088. style: 'color: #F56C6C'
  1089. }, '*'),
  1090. h('span', '' + column.label)
  1091. ]
  1092. },
  1093. // 子表table通过判断条件加必填标志
  1094. addRedStarChange(h, {
  1095. column
  1096. }) {
  1097. if (this.isDept) {
  1098. return [
  1099. h('span', '' + column.label)
  1100. ]
  1101. } else {
  1102. return [
  1103. h('span', {
  1104. style: 'color: #F56C6C'
  1105. }, '*'),
  1106. h('span', '' + column.label)
  1107. ]
  1108. }
  1109. },
  1110. justiceDetailsList() {
  1111. this.text = ' ';
  1112. let isFlag = [];
  1113. let count = 1;
  1114. const arr = JSON.parse(JSON.stringify(this.monthSaleGoalDetailsList))
  1115. if (this.isDept) {
  1116. for (const element of arr) {
  1117. const flag1 = (element.saleOrg !== null) && (element.saleZone !== null) && (element.custom !== null) && (
  1118. element.dept !== null) && (element.creator !== null) && (element.oneLevelClassify !== null) && (element
  1119. .oneLevelClassifyCode !== null) && (element.monthly !== null) && (element.goalValue !== 0);
  1120. const flag2 = (element.saleOrg !== undefined) && (element.saleZone !== undefined) && (element.custom !==
  1121. undefined) && (element.dept !== undefined) && (element.creator !== undefined) && (element
  1122. .oneLevelClassify !==
  1123. undefined) && (element.oneLevelClassifyCode !== undefined) && (element.monthly !== undefined);
  1124. if (flag1 && flag2) {
  1125. isFlag.push(true);
  1126. } else {
  1127. this.text += '[' + count + '] ';
  1128. isFlag.push(false);
  1129. }
  1130. count++;
  1131. }
  1132. for (const flag of isFlag) {
  1133. if (!flag) {
  1134. return true;
  1135. }
  1136. }
  1137. } else {
  1138. for (const element of arr) {
  1139. const flag1 = (element.saleOrg !== null) && (element.saleZone !== null) && (element.custom !== null) && (
  1140. element.dept !== null) && (element.creator !== null) && (element.materialCode !== null) && (element
  1141. .material !== null) && (element.monthly !== null) && (element.goalValue !== 0);
  1142. const flag2 = (element.saleOrg !== undefined) && (element.saleZone !== undefined) && (element.custom !==
  1143. undefined) && (element.dept !== undefined) && (element.creator !== undefined) && (element
  1144. .materialCode !==
  1145. undefined) && (element.material !== undefined) && (element.monthly !== undefined);
  1146. if (flag1 && flag2) {
  1147. isFlag.push(true);
  1148. } else {
  1149. this.text += '[' + count + '] ';
  1150. isFlag.push(false);
  1151. }
  1152. count++;
  1153. }
  1154. for (const flag of isFlag) {
  1155. if (!flag) {
  1156. return true;
  1157. }
  1158. }
  1159. }
  1160. },
  1161. setBeginAndEnd() {
  1162. let array = this.documentDateRange
  1163. if (this.documentDateRange !== null) {
  1164. this.queryParams.params.beginTime = array[0]
  1165. this.queryParams.params.endTime = array[1]
  1166. } else {
  1167. this.queryParams.params.beginTime = null
  1168. this.queryParams.params.endTime = null
  1169. }
  1170. },
  1171. handleCommand(command) {
  1172. if (command === 'export') {
  1173. console.log('导出主表');
  1174. this.handleExport()
  1175. } else if (command === 'exportDetails') {
  1176. console.log('导出明细');
  1177. this.handleExportDetails()
  1178. }
  1179. },
  1180. /** 导入按钮操作 */
  1181. handleImport() {
  1182. this.upload.open = true;
  1183. if (this.open) {
  1184. this.upload.title = "月销售/月利润目标填报明细导入"
  1185. this.upload.url = process.env.VUE_APP_BASE_API + "goal_management/monthSaleGoalDetails/importData/" + this
  1186. .form.id
  1187. } else {
  1188. this.upload.title = "月销售/月利润目标填报导入";
  1189. this.upload.url = process.env.VUE_APP_BASE_API + "goal_management/monthSaleGoal/importData"
  1190. }
  1191. },
  1192. /** 下载模板操作 */
  1193. importTemplate() {
  1194. if (this.open) {
  1195. this.download('goal_management/monthSaleGoalDetails/importTemplate', {},
  1196. `monthSaleGoalDetails_${new Date().getTime()}.xlsx`)
  1197. } else {
  1198. this.download('goal_management/monthSaleGoal/importTemplate', {},
  1199. `monthSaleGoal_${new Date().getTime()}.xlsx`)
  1200. }
  1201. },
  1202. // 文件上传中处理
  1203. handleFileUploadProgress(event, file, fileList) {
  1204. this.upload.isUploading = true;
  1205. },
  1206. // 文件上传成功处理
  1207. handleFileSuccess(response, file, fileList) {
  1208. this.upload.open = false;
  1209. this.upload.isUploading = false;
  1210. this.$refs.upload.clearFiles();
  1211. this.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response
  1212. .msg + "</div>", "导入结果", {
  1213. dangerouslyUseHTMLString: true
  1214. });
  1215. if (this.open) {
  1216. let array = response.data
  1217. for (const arrayElement of array) {
  1218. arrayElement.id = null
  1219. this.monthSaleGoalDetailsList.push(arrayElement)
  1220. }
  1221. this.computeTotal()
  1222. } else {
  1223. this.getList();
  1224. }
  1225. },
  1226. // 提交上传文件
  1227. submitFileForm() {
  1228. this.$refs.upload.submit();
  1229. },
  1230. // 选择物料后,给一级分类和二级分类复赋值
  1231. setClassify(one, two, obj, row) {
  1232. const oneArray = one.split("&")
  1233. const twoArray = two.split("&")
  1234. // 物料提醒文本
  1235. const memo = '名称:' + row.material + '; 编码:' + row.materialCode + '; 规格:' + row.specification + '; 包装:' + row
  1236. .packExplain + '; 型号:' + row.model + '。';
  1237. obj.memo = memo;
  1238. obj.oneLevelClassifyCode = oneArray[1]
  1239. obj.oneLevelClassify = oneArray[0]
  1240. obj.twoLevelClassifyCode = twoArray[1]
  1241. obj.twoLevelClassify = twoArray[0]
  1242. },
  1243. // 批量修改对话框的方法
  1244. dialogUpdateMoreSave() {
  1245. console.log(this.dialogUpdateMore);
  1246. if (this.dialogUpdateMore.updateData === null) {
  1247. return this.$message.error('请输入修改值')
  1248. }
  1249. const array = JSON.parse(JSON.stringify(this.monthSaleGoalDetailsList))
  1250. if (array.length !== 0) {
  1251. let condition = this.dialogUpdateMore.updateName
  1252. for (const element of array) {
  1253. if (condition === 1) {
  1254. element.saleOrg = JSON.parse(JSON.stringify(this.dialogUpdateMore.updateData))
  1255. } else if (condition === 2) {
  1256. element.saleZone = JSON.parse(JSON.stringify(this.dialogUpdateMore.updateData))
  1257. } else if (condition === 3) {
  1258. element.custom = JSON.parse(JSON.stringify(this.dialogUpdateMore.updateData))
  1259. } else if (condition === 4) {
  1260. element.dept = JSON.parse(JSON.stringify(this.dialogUpdateMore.updateData))
  1261. } else if (condition === 5) {
  1262. element.creator = JSON.parse(JSON.stringify(this.dialogUpdateMore.updateData))
  1263. } else if (condition === 6) {
  1264. element.department = JSON.parse(JSON.stringify(this.dialogUpdateMore.updateData))
  1265. } else if (condition === 7) {
  1266. element.monthly = JSON.parse(JSON.stringify(this.dialogUpdateMore.updateData))
  1267. }
  1268. }
  1269. }
  1270. this.monthSaleGoalDetailsList = array
  1271. this.dialogUpdateMore.dialogFormVisible = !this.dialogUpdateMore.dialogFormVisible
  1272. this.dialogUpdateMore.updateData = null
  1273. this.dialogUpdateMore.updateName = null
  1274. },
  1275. changeDialogData() {
  1276. this.dialogUpdateMore.updateData = null
  1277. },
  1278. resetDialogUpdateMore() {
  1279. this.dialogUpdateMore.updateName = null
  1280. this.dialogUpdateMore.updateData = null
  1281. },
  1282. //提交
  1283. handleSubmit(row) {
  1284. this.$modal.loading("提交中...");
  1285. submit(row.id).then(res => {
  1286. if (res.code === 200) {
  1287. this.$modal.notifySuccess("提交成功");
  1288. this.$modal.closeLoading();
  1289. row.status = '1';
  1290. }
  1291. }).catch(err => {
  1292. this.$message.error(err);
  1293. this.$modal.closeLoading();
  1294. })
  1295. },
  1296. //收回
  1297. handleReback(row) {
  1298. this.$modal.loading("收回中...");
  1299. let params = {
  1300. billCode: row.code,
  1301. fdId: row.flowId,
  1302. fdTemplateId: this.dict.type.oa_templete_id.find(item => {
  1303. return item.label == "销售目标"
  1304. }).value,
  1305. billMaker: row.createBy,
  1306. type: "3"
  1307. }
  1308. rollBack(params).then(res => {
  1309. if (res.code === 200) {
  1310. this.$modal.notifySuccess("收回成功");
  1311. this.$modal.closeLoading();
  1312. row.status = '0';
  1313. }
  1314. }).catch(err => {
  1315. this.$message.error(err);
  1316. this.$modal.closeLoading();
  1317. })
  1318. },
  1319. //模板下载
  1320. handleTemplateDownload() {
  1321. this.download('/goal_management/monthSaleGoalDetails/importTemplate', {},
  1322. `月销售/月利润目标填报明细导入模板_${new Date().getTime()}.xlsx`)
  1323. },
  1324. //导入
  1325. handleImport(file) {
  1326. this.loading = true;
  1327. let formData = new FormData()
  1328. formData.append('file', file.file)
  1329. importData(formData).then((res) => {
  1330. console.log('res', res);
  1331. if (res.code == '200') {
  1332. this.monthSaleGoalDetailsList.push.apply(this.monthSaleGoalDetailsList, res.data);
  1333. this.$message.success(res.msg);
  1334. } else {
  1335. this.$message.success(res.msg);
  1336. }
  1337. this.loading = false;
  1338. }).catch((e) => {
  1339. this.$message.error(e.message)
  1340. }).finally((e) => {
  1341. this.$refs['upload'].clearFiles();
  1342. this.loading = false;
  1343. })
  1344. },
  1345. //查询该时间范围内对应客户的物料数据
  1346. getMaterialList() {
  1347. this.loading = true;
  1348. let data = {
  1349. customCode: this.form.customCode,
  1350. type: this.materialRange
  1351. }
  1352. console.log(data, 'data')
  1353. getMaterialRangeList(data).then((res) => {
  1354. console.log(res, 'res')
  1355. this.monthSaleGoalDetailsList = res;
  1356. for (const item of this.monthSaleGoalDetailsList) {
  1357. item.saleOrg = this.$store.state.user.orgName;
  1358. item.saleZone = this.form.saleZone;
  1359. item.custom = this.form.custom;
  1360. item.dept = this.form.dept;
  1361. item.creator = this.form.creator;
  1362. item.monthly = this.form.documentDate.substring(0, 7);
  1363. }
  1364. }).catch((e) => {
  1365. this.$message.error(e.message)
  1366. }).finally((e) => {
  1367. this.loading = false;
  1368. })
  1369. },
  1370. calculate(row) {
  1371. if (!(row.price == 0 || row.price == null || row.price == undefined)) {
  1372. row.goalValue = row.num * row.price;
  1373. }
  1374. },
  1375. // 判断操作人部门是否属于湖南公司、湖南公司本部、基卫销售部
  1376. judge() {
  1377. let that = this;
  1378. that.isDept = false;
  1379. that.isJiwei = false;
  1380. let data = '湖南公司';
  1381. getDeptIds(data).then(hunan => {
  1382. for (const h of hunan) {
  1383. if (that.$store.state.user.deptId === h) {
  1384. that.isDept = true;
  1385. }
  1386. }
  1387. })
  1388. data = '基卫销售部';
  1389. getDeptIds(data).then(jiwei => {
  1390. for (const j of jiwei) {
  1391. if (that.$store.state.user.deptId === j) {
  1392. that.isDept = true;
  1393. that.isJiwei = true;
  1394. }
  1395. }
  1396. })
  1397. },
  1398. // 树形参照
  1399. chooseTreeReferForMain(type, isPage, title, index) {
  1400. this.referCondition.type = type;
  1401. this.referCondition.isPage = isPage;
  1402. this.referCondition.title = title;
  1403. this.index = null;
  1404. this.index = index;
  1405. this.$refs.treeMain.init(this.referCondition);
  1406. },
  1407. selectionsToInputForMain(selection) {
  1408. this.classOptions = selection;
  1409. if (this.referCondition.title === '一级物料分类') {
  1410. if (this.classOptions[0].code.length > 2) {
  1411. return this.$message.info('请在一级分类下选择');
  1412. }
  1413. this.monthSaleGoalDetailsList[this.index].oneLevelClassifyCode = selection[0].code;
  1414. this.monthSaleGoalDetailsList[this.index].oneLevelClassify = selection[0].name;
  1415. } else if (this.referCondition.title === '二级物料分类') {
  1416. if (this.classOptions[0].code.lastIndexOf("-") == 3 || this.classOptions[0].code.indexOf("90") == 0) {
  1417. this.monthSaleGoalDetailsList[this.index].oneLevelClassifyCode = selection[0].parentCode;
  1418. this.monthSaleGoalDetailsList[this.index].oneLevelClassify = selection[0].parentName;
  1419. this.monthSaleGoalDetailsList[this.index].twoLevelClassifyCode = selection[0].code;
  1420. this.monthSaleGoalDetailsList[this.index].twoLevelClassify = selection[0].name;
  1421. } else {
  1422. return this.$message.info('请在二级分类下选择');
  1423. }
  1424. }
  1425. },
  1426. // 当单据日期改变时改变明细月份
  1427. setItemMonthly() {
  1428. for (let i = 0; i < this.monthSaleGoalDetailsList.length; i++) {
  1429. this.monthSaleGoalDetailsList[i].monthly = this.form.documentDate.substring(0, 7);
  1430. }
  1431. },
  1432. // 详情页批量删除
  1433. batchRemove() {
  1434. if (this.selection == null || this.selection == undefined || this.selection.length == 0) {
  1435. this.$modal.notifyWarning("请至少选择一条明细!");
  1436. } else {
  1437. this.$confirm('是否确认批量删除?').then(_ => {
  1438. this.selection.forEach((item) => {
  1439. item.delFlag = "2";
  1440. });
  1441. let delList = [];
  1442. delList = this.monthSaleGoalDetailsList.filter((item) => {
  1443. return item.delFlag == "2";
  1444. });
  1445. this.monthSaleGoalDetailsList =
  1446. this.monthSaleGoalDetailsList.filter((item) => {
  1447. return item.delFlag == "0";
  1448. });
  1449. this.delMonthSaleGoalDetailsList.push(...delList);
  1450. }).catch(_ => {});
  1451. }
  1452. },
  1453. }
  1454. }
  1455. </script>