index.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. <template>
  2. <div class="app-container">
  3. <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="90px">
  4. <el-form-item label="门店" prop="channelId">
  5. <el-select v-model="queryParams.channelId" placeholder="请选择门店" style="width: 100%;" filterable clearable :filter-method="dataFilter" @change="pageParams.pageNum = 1;handleQuery()">
  6. <el-option v-for="(item) in siteList" :key="item.channelId" :label="item.name" :value="item.channelId">
  7. <div>
  8. <span style="float: left;">{{item.name}} </span>
  9. <span style="float: right;">{{item.mobile}}</span>
  10. </div>
  11. </el-option>
  12. </el-select>
  13. </el-form-item>
  14. <el-form-item label="商品名称">
  15. <el-input v-model="queryParams.title" placeholder="请输入商品名称" clearable size="small" style="width: 240px" @change="pageParams.pageNum = 1;handleQuery()" />
  16. </el-form-item>
  17. <el-form-item label="订单号">
  18. <el-input v-model="queryParams.orderId" placeholder="输入订单编号" clearable size="small" style="width: 240px" @change="pageParams.pageNum = 1;handleQuery()" />
  19. </el-form-item>
  20. <el-form-item label="入库时间">
  21. <el-date-picker v-model="tradeTimeArr" type="datetimerange" size="small" value-format="timestamp" range-separator="至" start-placeholder="时间选择" end-placeholder="时间选择" @change="tardeTime">
  22. </el-date-picker>
  23. </el-form-item>
  24. <!-- <el-form-item label="手机号码">
  25. <el-input v-model="queryParams.tel" placeholder="输入手机号" clearable size="small" style="width: 240px" @change="pageParams.pageNum = 1;handleQuery()" />
  26. </el-form-item> -->
  27. <el-form-item label="状态">
  28. <el-select v-model="queryParams.settleStatus" placeholder="请选择" clearable @change="pageParams.pageNum = 1;handleQuery()">
  29. <el-option label="全部" value="" />
  30. <el-option label="未结算" value="1" />
  31. <el-option label="结算中" value="3" />
  32. <el-option label="已结算" value="2" />
  33. <el-option label="核销完成" value="4" />
  34. </el-select>
  35. </el-form-item>
  36. <br>
  37. <el-form-item label="剩余库存">
  38. <el-input v-model="queryParams.minStock" placeholder="最小值" @change="pageParams.pageNum = 1;handleQuery()" clearable @keyup.enter.native="pageParams.pageNum = 1;handleQuery()" />
  39. </el-form-item>
  40. <el-form-item label="-" label-width="6px">
  41. <el-input v-model="queryParams.maxStock" placeholder="最大值" @change="pageParams.pageNum = 1;handleQuery()" clearable @keyup.enter.native="pageParams.pageNum = 1;handleQuery()" />
  42. </el-form-item>
  43. <el-form-item>
  44. <el-button type="primary" icon="el-icon-search" size="mini" @click="pageParams.pageNum = 1;handleQuery()">搜索
  45. </el-button>
  46. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置
  47. </el-button>
  48. </el-form-item>
  49. </el-form>
  50. <!-- 导出、刷新 -->
  51. <el-row :gutter="10" class="mb8">
  52. <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
  53. </el-row>
  54. <!-- 列表 -->
  55. <el-table ref="table" v-loading="loading" :data="list">
  56. <!-- 展开盲票组列表 -->
  57. <el-table-column type="expand">
  58. <template slot-scope="{ row }">
  59. <el-table :data="row.items" row-key="itemId">
  60. <el-table-column label="商品图片" min-width="80">
  61. <div slot-scope="{ row }">
  62. <el-image style="width: 100px; height: 100px" :src="row.picUrl" :preview-src-list="[row.picUrl]" />
  63. </div>
  64. </el-table-column>
  65. <el-table-column label="商品名称" prop="title" min-width="80" />
  66. <el-table-column label="规格" min-width="100">
  67. <template slot-scope="{ row }">
  68. <div>{{ row.properties || "--" }}</div>
  69. </template>
  70. </el-table-column>
  71. <el-table-column label="采购成本(单价)" prop="purchaseCost" min-width="80" >
  72. <template slot-scope="{ row }">
  73. <div>¥{{ $numberFormat(row.purchaseCost) }}</div>
  74. </template>
  75. </el-table-column>
  76. <el-table-column label="库存" prop="quantity" min-width="80" />
  77. <el-table-column label="已核销" prop="verifyQty" min-width="80" />
  78. <el-table-column label="剩余库存" prop="remainQty" min-width="80" />
  79. </el-table>
  80. </template>
  81. </el-table-column>
  82. <!-- 不展开列表 -->
  83. <el-table-column label="订单号" prop="orderId" min-width="110" />
  84. <el-table-column label="入库时间" min-width="110">
  85. <template slot-scope="{ row }">
  86. <div>{{ row.items && row.items[0] && parseTime(row.items[0].createdTime) }}</div>
  87. </template>
  88. </el-table-column>
  89. <el-table-column label="门店(手机号)" prop="channelName" min-width="120" >
  90. <template slot-scope="{ row }">
  91. <div>{{ row.channelName+'('+row.mobile+')' }}</div>
  92. </template>
  93. </el-table-column>
  94. <el-table-column label="总库存" prop="totalQuantity" min-width="50" />
  95. <el-table-column label="总已核销" prop="totalVerifyQty" min-width="50" />
  96. <el-table-column label="剩余总库存" prop="totalRemainQty" min-width="55" />
  97. <!-- <el-table-column label="总采购成本" min-width="70">
  98. <template slot-scope="{ row }">
  99. <div>¥{{ $numberFormat(row.totalPurchaseCost) }}</div>
  100. </template>
  101. </el-table-column> -->
  102. <el-table-column label="结算库存" prop="totalSettleQty" min-width="50" />
  103. <el-table-column label="状态" align="center">
  104. <template slot-scope="{ row }">
  105. <div>
  106. <el-tag :type="row.status.value == 1? 'success' : 'info'" v-if="row.status">{{
  107. row.status.desc
  108. }}
  109. </el-tag>
  110. <el-tag type="info" v-else>--</el-tag>
  111. </div>
  112. </template>
  113. </el-table-column>
  114. <el-table-column label="操作" align="center" width="80">
  115. <template slot-scope="{ row }">
  116. <div>
  117. <el-button v-hasPermi="['business:channelGoods:query']" type="text" @click="getDetail(row)">查看详情
  118. </el-button>
  119. <el-button v-hasPermi="['business:channelGoodsOrder:push']" v-if="row.status && row.status.value == 1" type="text" @click="toInventory(row)">去结算
  120. </el-button>
  121. </div>
  122. </template>
  123. </el-table-column>
  124. </el-table>
  125. <el-dialog title="提示" :visible.sync="dialogVisible" width="60%" :before-close="handleClose">
  126. <div v-html="responseData"></div>
  127. <span slot="footer" class="dialog-footer">
  128. <el-button type="primary" @click="dialogVisible = false">确 定</el-button>
  129. </span>
  130. </el-dialog>
  131. <!-- 分页 -->
  132. <pagination v-show="total > 0" :total="total" :page.sync="pageParams.pageNum" :limit.sync="pageParams.pageSize" @pagination="getList" />
  133. <!-- 结算 -->
  134. <inventory-goods :inventory-show="inventoryShow" :inventory-info="info" @close="close" v-if="inventoryShow"/>
  135. </div>
  136. </template>
  137. <script>
  138. import { getInventoryList } from "@/api/business/inventory";
  139. import { listAllSaleSite } from "@/api/admin/salesite";
  140. import { publicFileGetUrl } from "@/api/common";
  141. import InventoryGoods from "./components/InventoryGoods";
  142. export default {
  143. name: "Inventory",
  144. components: {
  145. InventoryGoods,
  146. },
  147. data() {
  148. return {
  149. loading: false,
  150. showSearch: true,
  151. dialogVisible: false,
  152. // 筛选
  153. queryParams: {
  154. minStock: "",
  155. maxStock: "",
  156. channelId: "",
  157. title: "",
  158. orderId: "",
  159. startTime: "",
  160. endTime: "",
  161. settleStatus: "",
  162. tel: "",
  163. },
  164. // 分页
  165. pageParams: {
  166. pageNum: 1,
  167. pageSize: 10,
  168. },
  169. // 总条数
  170. total: 0,
  171. list: [],
  172. // 门店
  173. merchantArr: [],
  174. // 下单时间
  175. tradeTimeArr: [],
  176. // 结算弹窗显示
  177. inventoryShow: false,
  178. // 订单详情
  179. info: {},
  180. fileSaveUrl: '',
  181. reqData: {},
  182. responseData: '',
  183. siteList: [],
  184. siteCopyList: [],
  185. };
  186. },
  187. created() {
  188. this.getList();
  189. this.getSaleSiteList()
  190. },
  191. methods: {
  192. // 获取门店下拉列表
  193. getSaleSiteList() {
  194. listAllSaleSite({}).then(response => {
  195. this.siteList = response.data || [];
  196. this.siteCopyList = response.data || [];
  197. });
  198. },
  199. dataFilter(val) {
  200. if (val) { //val存在
  201. this.siteList = this.siteCopyList.filter((item) => {
  202. if (!!~item.mobile.indexOf(val) || !!~item.mobile.toUpperCase().indexOf(val.toUpperCase())
  203. || !!~item.name.indexOf(val) || !!~item.name.indexOf(val)) {
  204. return true
  205. }
  206. })
  207. } else { //val为空时,还原数组
  208. this.siteList = this.siteCopyList;
  209. }
  210. },
  211. handleClose(done) {
  212. this.$confirm('确认关闭?')
  213. .then(_ => {
  214. done();
  215. })
  216. .catch(_ => {
  217. });
  218. },
  219. // 订单列表
  220. getList() {
  221. let data = {
  222. ...this.queryParams,
  223. }
  224. this.loading = true;
  225. getInventoryList(
  226. "pageNum=" +
  227. this.pageParams.pageNum +
  228. "&pageSize=" +
  229. this.pageParams.pageSize +
  230. "&",
  231. data
  232. )
  233. .then((res) => {
  234. this.loading = false;
  235. if (res.code == 0) {
  236. res.rows.forEach((item) => {
  237. let items = item.items;
  238. items.forEach((item) => {
  239. let picUrlArr = item.picUrl.split(",");
  240. item.picUrl = publicFileGetUrl + picUrlArr[0];
  241. });
  242. item.status = JSON.parse(item.status);
  243. });
  244. this.total = res.total;
  245. this.list = res.rows;
  246. }
  247. })
  248. .catch(() => {
  249. this.loading = false;
  250. });
  251. },
  252. //搜索
  253. handleQuery() {
  254. this.siteList = this.siteCopyList;
  255. this.pageParams.pageNum = 1;
  256. this.getList();
  257. },
  258. // 重置
  259. resetQuery() {
  260. this.queryParams = {
  261. minStock: "",
  262. maxStock: "",
  263. channelId: "",
  264. title: "",
  265. orderId: "",
  266. startTime: "",
  267. endTime: "",
  268. settleStatus: "",
  269. tel: "",
  270. };
  271. this.tradeTimeArr = [];
  272. this.getList();
  273. },
  274. // 选择下单时间
  275. tardeTime(e) {
  276. if (e) {
  277. this.queryParams.startTime = e[0];
  278. this.queryParams.endTime = e[1];
  279. this.pageParams.pageNum = 1
  280. this.handleQuery();
  281. } else {
  282. this.queryParams.startTime = "";
  283. this.queryParams.endTime = "";
  284. this.pageParams.pageNum = 1
  285. this.handleQuery();
  286. }
  287. },
  288. // 查看详情
  289. getDetail(row) {
  290. this.$router.push({ name: "InventoryDetail", query: { id: row.orderId } });
  291. },
  292. // 点击去结算
  293. toInventory(row) {
  294. this.info = row;
  295. this.inventoryShow = true;
  296. },
  297. // 关闭结算
  298. close() {
  299. this.inventoryShow = false;
  300. this.getList();
  301. },
  302. },
  303. };
  304. </script>
  305. <style lang="scss" scoped>
  306. ::v-deep .el-tabs--border-card > .el-tabs__content {
  307. padding: 0;
  308. }
  309. </style>
  310. <style lang="scss">
  311. .msgbox {
  312. width: 60%;
  313. }
  314. </style>