detail.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. <template>
  2. <div class="goodsCostDetail">
  3. <div class="goodsCostDetail-main" v-if="powers.some((i) => i == '007')">
  4. <el-tabs v-model="activeTabs">
  5. <el-tab-pane label="新建商品成本" name="0" v-if="queryType === 'add'">
  6. <base-form
  7. v-if="newTime !== ''"
  8. :type="queryType"
  9. :id="queryId"
  10. :newTime="newTime"
  11. :sitem="sitem"
  12. @refresh="refresh"
  13. />
  14. </el-tab-pane>
  15. <el-tab-pane label="商品成本详情" name="1" v-if="queryType !== 'add'">
  16. <el-collapse v-model="activeNames" style="margin: -18px 0 0 0">
  17. <tempalte v-if="queryType === 'editCoin' || queryType === 'editBase' || queryType === 'edit'">
  18. <el-collapse-item title="商品成本详情" name="0">
  19. <base-form
  20. v-if="newTime !== ''"
  21. :type="queryType"
  22. :id="queryId"
  23. :newTime="newTime"
  24. :sitem="sitem"
  25. @refresh="refresh"
  26. />
  27. </el-collapse-item>
  28. </tempalte>
  29. <template v-else>
  30. <el-collapse-item title="基础信息" name="1">
  31. <show-data-table :columns="basicColumns" :sitem="sitem">
  32. <template slot="good_img">
  33. <template v-if="sitem.good_img">
  34. <div style="max-height: 24px;overflow: hidden;">
  35. <el-image style="height: 24px;width: 24px;margin-right:5px" v-for="(img,index) in sitem.good_img.split(',')" :src="img" :preview-src-list="sitem.good_img.split(',')" :key="index" />
  36. </div>
  37. </template>
  38. </template>
  39. <template slot="good_info_img">
  40. <div style="max-height: 24px;overflow: hidden;">
  41. <el-image style="height: 24px;width: 24px" :src="sitem.good_info_img" :preview-src-list="[sitem.good_info_img]" />
  42. </div>
  43. </template>
  44. <template slot="cat_info">
  45. {{sitem.cat_info ? sitem.cat_info.map(({name}) => name).join('_') : '--' }}
  46. </template>
  47. <template slot="good_name">
  48. <img
  49. v-if="sitem.good_thumb_img"
  50. v-viewer
  51. style="width: 23px; height: 23px; margin: 0 5px 0 0"
  52. class="fl"
  53. :src="sitem.good_thumb_img"
  54. alt=""
  55. >
  56. <span>{{ sitem.good_name }}</span>
  57. <span v-for="(si, i) in sitem.speclist" :key="si.spec_id + i">
  58. <span v-if="i !== 0">-</span>
  59. <span v-else>_</span>
  60. <span>{{ si.spec_name }}[{{ si.spec_value }}]</span>
  61. </span>
  62. <el-popover placement="top" width="300" trigger="hover">
  63. <ul>
  64. <li
  65. v-if=" newTime !== '' && isDisplayPrivateField('1')"
  66. >
  67. <span>商品成本编号:</span><span>{{ sitem.spuCode }}</span>
  68. </li>
  69. </ul>
  70. <i slot="reference" class="el-icon-warning-outline fr" />
  71. </el-popover>
  72. </template>
  73. <template slot="noble">
  74. <span
  75. v-if="sitem.noble_metal"
  76. >{{ sitem.noble_weight ? sitem.noble_weight : "0" }}g-{{
  77. sitem.noble_name
  78. }}-{{ sitem.gold_price ? sitem.gold_price : "0" }}元/g-{{
  79. sitem.is_gold_price + '' === "0" ? "不" : ""
  80. }}启用实时金价-{{ sitem.is_diff + '' === "1" ? "有" : "无" }}工差-{{
  81. sitem.config
  82. }}-{{ sitem.other_config }}</span>
  83. </template>
  84. <template slot="weight">
  85. {{sitem.weight}}g
  86. </template>
  87. <template slot="tax">
  88. {{sitem.tax}}%
  89. </template>
  90. <template slot="is_stock">
  91. {{String(sitem.is_stock) === '0' ? '非库存品' : '库存品'}}
  92. </template>
  93. <template slot="is_exclusive">
  94. {{String(sitem.is_exclusive) === '0' ? '非泰康' : '泰康'}}
  95. </template>
  96. <template slot="noble_weight">{{sitem.noble_weight}}g</template>
  97. <template slot="is_gold_price">{{String(sitem.is_gold_price) === '1' ? '是' : '否'}}</template>
  98. <template slot="is_diff">{{String(sitem.is_diff) === '1' ? '有公差' : '无工差'}}</template>
  99. <template slot="packing_weight">
  100. {{sitem.packing_weight}}g
  101. </template>
  102. <template slot="delivery_day">{{sitem.delivery_day}}天</template>
  103. <template slot="lead_time">{{sitem.lead_time}}天</template>
  104. <template slot="sample_day">{{sitem.sample_day}}天</template>
  105. <template slot="delivery_place">{{delivery_place}}</template>
  106. <template slot="origin_place">{{origin_place}}</template>
  107. </show-data-table>
  108. </el-collapse-item>
  109. <el-collapse-item title="固定与阶梯成本" name="6" v-if="displayCostField">
  110. <show-data-table :columns="ladderColumns" :sitem="sitem">
  111. <template slot="demo_fee">{{sitem.demo_fee}}元</template>
  112. <template slot="open_fee">{{sitem.open_fee}}元</template>
  113. <template slot="sample_fee">{{sitem.sample_fee}}元</template>
  114. <template slot="market_price">{{sitem.market_price}}元</template>
  115. <template slot="data_table">
  116. <el-table size="mini" :data="sitem.nakelist">
  117. <el-table-column prop="min_num" label="起订量(>=)" />
  118. <el-table-column prop="nake_fee" label="成本单价" />
  119. <el-table-column prop="cost_fee" label="工艺费" />
  120. <el-table-column prop="delivery_fee" label="物流费" />
  121. <el-table-column prop="cert_fee" label="证书费" />
  122. <el-table-column prop="mark_fee" label="加标费" />
  123. <el-table-column prop="package_fee" label="包装费" />
  124. <el-table-column prop="other_fee" label="其他费用" />
  125. <el-table-column prop="nake_total" label="成本合计" />
  126. </el-table>
  127. </template>
  128. </show-data-table>
  129. </el-collapse-item>
  130. <el-collapse-item
  131. title="采购部门审批"
  132. v-if="
  133. ((status + '' === '0' && ppowers.some((i) => i == '0')) ||
  134. (status + '' === '2' && ppowers.some((i) => i == '2')) ||
  135. (status + '' === '3' && ppowers.some((i) => i == '3'))) &&
  136. queryType === 'view'
  137. "
  138. >
  139. <exam-form
  140. :statusList="statusList"
  141. :newTime="newTime"
  142. :disabled="false"
  143. :isMust="false"
  144. @searchChange="examForm"
  145. />
  146. </el-collapse-item>
  147. </template>
  148. </el-collapse>
  149. </el-tab-pane>
  150. <el-tab-pane label="审批记录" name="2" v-if="queryType !== 'add'">
  151. <process-time-line
  152. v-if="newTime !== ''"
  153. :newTime="newTime"
  154. :type="'SPCB'"
  155. :orderCode="queryId"
  156. />
  157. </el-tab-pane>
  158. <el-tab-pane label="流程图" name="3" v-if="queryType !== 'add'">
  159. <flow-chart process_id="15" type="SPCB" :orderCode="queryId" />
  160. </el-tab-pane>
  161. </el-tabs>
  162. </div>
  163. <div v-else>
  164. <no-auth></no-auth>
  165. </div>
  166. </div>
  167. </template>
  168. <script>
  169. import asyncRequest from "@/apis/service/goodStore/goodsCost";
  170. import resToken from "@/mixins/resToken";
  171. import { mapGetters } from "vuex";
  172. import baseForm from "./components/baseForm";
  173. import costForm from './components/costDetail'
  174. import ShowDataTable from '@/views/standingBook/components/detail-data-table.vue'
  175. import { basicColumns, packingColumns, sendColumns, imageColumns, ladderColumns } from './columns'
  176. import privateField from "@/mixins/privateField";
  177. export default {
  178. name: "goodsCostDetail",
  179. mixins: [resToken,privateField],
  180. components: {
  181. ShowDataTable,
  182. baseForm,
  183. costForm
  184. },
  185. computed: {
  186. ...mapGetters(["tablebtnSize", "searchSize", "size", "private_field", "originLevel"]),
  187. displayCostField(){
  188. return (["1", '3']).includes(this.originLevel) || this.private_field.includes('1')
  189. },
  190. powers() {
  191. const { btnList } = this.$store.getters
  192. const tran = btnList.find((item) => item.menu_route == "goodsCostDetail") || {};
  193. const { action } = tran ?? {};
  194. return action ?? [];
  195. },
  196. ppowers() {
  197. const tran =
  198. this.$store.getters.roleProcess.find((i) => i.process_type === "SPCB") || {};
  199. const { action } = tran ?? {};
  200. return action ?? [];
  201. },
  202. },
  203. data() {
  204. return {
  205. statusList: [],
  206. basicColumns,
  207. packingColumns,
  208. sendColumns,
  209. imageColumns,
  210. ladderColumns,
  211. size: "small",
  212. activeTabs: "1",
  213. activeNames: ["0", "1", "2", "3", "4", "5", "6"],
  214. newTime: "",
  215. loading: false,
  216. queryType: "",
  217. queryId: "",
  218. status: "",
  219. sitem: null,
  220. delivery_place: '',
  221. origin_place: ''
  222. };
  223. },
  224. mounted() {
  225. this.initForm();
  226. },
  227. methods: {
  228. async initForm() {
  229. const { id, type } = this.$route.query;
  230. this.queryId = id;
  231. this.queryType = type;
  232. this.activeTabs = type === "add" ? "0" : "1";
  233. this.loading = true;
  234. if (this.queryType === "add") {
  235. this.sitem = {};
  236. this.getNewTime();
  237. } else {
  238. await this.initData();
  239. await this.getArea('delivery_place');
  240. await this.getArea('origin_place');
  241. }
  242. this.loading = false;
  243. },
  244. // 点击业务审核的保存按钮
  245. async examForm(e) {
  246. console.log(e);
  247. if (!this.loading) {
  248. let type = "";
  249. if (e.state + '' === "1") {
  250. type = "1";
  251. } else {
  252. type =
  253. this.status + '' === "0"
  254. ? "6"
  255. : this.status + '' === "2"
  256. ? "4"
  257. : this.status + '' === "3"
  258. ? "5"
  259. : "";
  260. }
  261. await this.setstatus(type, "提交采购部门审核", e.remark);
  262. }
  263. },
  264. async getArea(prop = 'delivery_place'){
  265. const chunks = this.sitem[prop].split(',');
  266. let { data: province } = await asyncRequest.province();
  267. province = province.find(({province_code}) => province_code === chunks[0])
  268. let { data: city } = await asyncRequest.city({code: chunks[0]})
  269. city = city.find(({city_code}) => city_code === chunks[1])
  270. let { data: area } = await asyncRequest.area({code: chunks[1]})
  271. area = area.find(({area_code}) => area_code === chunks[2])
  272. this[prop] = [province,city,area].map(({name}) => name).join("_")
  273. },
  274. async setstatus(type, detail, remark) {
  275. await this.$confirm(`确定要${detail}?`, {
  276. confirmButtonText: "确定",
  277. cancelButtonText: "取消",
  278. type: "warning",
  279. })
  280. .then(async () => {
  281. let _model = {
  282. spuCode: this.queryId,
  283. status: type,
  284. remark: remark,
  285. };
  286. let res = await asyncRequest.status(_model);
  287. if (res && res.code === 0) {
  288. this.$notify.success({
  289. title: "提交成功!",
  290. message: "",
  291. });
  292. await this.initForm();
  293. } else if (res && res.code >= 100 && res.code <= 104) {
  294. await this.logout();
  295. } else {
  296. this.$message.warning(res.message);
  297. }
  298. })
  299. .catch(() => {
  300. console.log("取消");
  301. });
  302. },
  303. handleClick(row) {
  304. console.log(row);
  305. },
  306. async refresh(e) {
  307. await this.routeReGoto("goodsCost", {});
  308. },
  309. async initData() {
  310. this.loading = true;
  311. const { code, message, data } = await asyncRequest.detail({
  312. spuCode: this.queryId,
  313. });
  314. this.loading = false;
  315. if (code === 0) {
  316. this.sitem = JSON.parse(JSON.stringify(data));
  317. const { status } = this.sitem;
  318. this.status = status;
  319. this.getNewTime();
  320. } else if (code >= 100 && code <= 104) {
  321. await this.logout();
  322. } else {
  323. this.$message.warning(message);
  324. }
  325. },
  326. getNewTime() {
  327. this.newTime = new Date().valueOf();
  328. },
  329. },
  330. };
  331. </script>
  332. <style lang="scss" scoped>
  333. .goodsCostDetail {
  334. width: 100%;
  335. box-sizing: border-box;
  336. .goodsCostDetail-main {
  337. box-sizing: border-box;
  338. padding: 10px;
  339. height: 100%;
  340. width: 100%;
  341. }
  342. .goodsCostDetail-title {
  343. border-top: 1px solid #ebeef5;
  344. span {
  345. height: 50px;
  346. line-height: 50px;
  347. font-family: "微软雅黑", sans-serif;
  348. font-weight: 400;
  349. font-style: normal;
  350. font-size: 16fpx;
  351. text-align: left;
  352. }
  353. }
  354. /deep/ .ddiv {
  355. border-top: 1px solid #dcdfe6;
  356. }
  357. /deep/ .dtitle {
  358. width: 40px;
  359. text-align: center;
  360. height: 100%;
  361. min-height: 100%;
  362. ul {
  363. padding: 12px 0 0 0;
  364. }
  365. }
  366. /deep/ .dmain {
  367. padding: 20px 0 0 0;
  368. width: calc(100% - 40px);
  369. border-left: 1px solid #dcdfe6;
  370. }
  371. }
  372. </style>