123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430 |
- <template>
- <div class="price-editor">
- <s-header :name="$t('device.modifyPricePage.title')" :noback="false" />
- <div class="content-container">
- <!-- 设备信息卡片 -->
- <div class="device-card">
- <div class="device-header">
- <div class="header-indicator"></div>
- <h3 class="device-name">
- {{ $t("device.modifyPricePage.equipmentName") }}:{{
- equipmentName
- }}
- </h3>
- </div>
- </div>
- <!-- 商品列表卡片 -->
- <div class="goods-card">
- <!-- 操作头部 -->
- <div class="card-header">
- <div class="goods-count">
- {{ $t("device.modifyPricePage.total") }}
- <span class="highlight">{{ tableData.length }}</span>
- {{ $t("device.modifyPricePage.goods") }}
- </div>
- <van-button
- icon="edit"
- plain
- hairline
- @click="noticeClk"
- class="batch-btn"
- >
- {{ $t("device.modifyPricePage.batchModify") }}
- </van-button>
- </div>
- <!-- 商品列表 -->
- <div class="goods-list">
- <div
- v-for="(item, index) in tableData"
- :key="index"
- class="goods-item"
- >
- <div class="goods-info">
- <van-image
- class="goods-image"
- :src="showSugerPhoto(item)"
- fit="cover"
- />
- <span class="goods-name">{{ item.productName }}</span>
- </div>
- <div class="price-action">
- <template v-if="item.isEdit">
- <van-field
- type="number"
- v-model="item.rmbPrice"
- class="price-input"
- :border="false"
- clearable
- >
- <template #extra>
- <span class="currency-symbol">{{ currencySymbol }}</span>
- </template>
- </van-field>
- <van-icon
- name="success"
- class="action-icon"
- @click="editClk(item, 2)"
- />
- </template>
- <template v-else>
- <div class="price-display">
- <span class="currency">{{ currencySymbol }}</span>
- <span class="price">{{ item.rmbPrice }}</span>
- </div>
- <van-icon
- name="edit"
- class="action-icon"
- @click="editClk(item, 1)"
- />
- </template>
- </div>
- </div>
- </div>
- </div>
- </div>
- <!-- 批量修改弹窗 -->
- <kDialog
- :isCloseForConfirm="false"
- :dialogTitle="$t('device.modifyPricePage.batchPrice')"
- :confirmBtnTxt="$t('device.modifyPricePage.modifySubmit')"
- ref="kDialogRef"
- @confirmclk="confirmClk"
- >
- <template #content>
- <van-field
- type="number"
- v-model="cofficentForm.price"
- :placeholder="$t('device.modifyPricePage.batchPricePlace')"
- :label="$t('device.modifyPricePage.batchPrice')"
- class="batch-field"
- >
- <template #extra>
- <span class="currency-symbol">{{ currencySymbol }}</span>
- </template>
- </van-field>
- </template>
- </kDialog>
- </div>
- </template>
- <script>
- import kDialog from "@/components/commom/kDialog/index.vue";
- // 导入接口
- import { selectProducts, Api_getUpdaProdPrice } from "@/service/device/index";
- import sHeader from "@/components/SimpleHeader";
- import { reactive, ref } from "@vue/reactivity";
- import { onMounted } from "@vue/runtime-core";
- import { useRoute } from "vue-router";
- import { showToast } from "vant";
- import { useI18n } from "vue-i18n";
- // import { styleUrl } from "../../../common/js/utils";
- export default {
- components: { sHeader, kDialog },
- setup() {
- // 引入语言
- const { t } = useI18n();
- // 批量修改弹窗
- const kDialogRef = ref(null);
- // 点击批量修改
- const noticeClk = () => {
- cofficentForm.price = "";
- kDialogRef.value.openDialog();
- };
- // 点击确定按钮
- const confirmClk = () => {
- if (!cofficentForm.price) {
- showToast(t("device.modifyPricePage.batchPricePlace"));
- return;
- }
- cofficentForm.no = "";
- cofficentForm.type = 1;
- updatePrice();
- kDialogRef.value.closeDialog();
- };
- // 商品图片路径处理
- const showSugerPhoto = (row) => {
- let imgId = row.no;
- if (imgId) {
- return require(`../../../assets/order/spunSugar/goods/${imgId}.png`);
- }
- return imgId;
- };
- // 路由
- const route = useRoute();
- // 商品数据
- const tableData = ref([]);
- // 设备名称
- const equipmentName = ref("");
- // 刚进页面
- onMounted(() => {
- // 加载样式
- // styleUrl("modifyPrice");
- const id = route.query.deviceId || "";
- const name = route.query.name || "";
- if (id) {
- cofficentForm.equipmentId = id;
- equipmentName.value = name;
- getList();
- }
- });
- // 获取商品列表
- const getList = () => {
- selectProducts({ equipmentId: cofficentForm.equipmentId }).then((res) => {
- console.log("res", res);
- const { data } = res.data;
- if (data) {
- if (data.length > 0) {
- // 是否修改状态
- data.forEach((item) => {
- item.isEdit = false;
- });
- }
- tableData.value = data;
- }
- });
- };
- // 修改的价格
- const cofficentForm = reactive({
- equipmentId: "",
- no: "",
- price: "",
- type: "",
- });
- // 自定义货币符号
- const currencySymbol = ref("¥");
- const loginUserStr = localStorage.getItem("loginUser");
- const loginUser = JSON.parse(loginUserStr);
- if (loginUser.currencySymbol) {
- currencySymbol.value = loginUser.currencySymbol;
- } else {
- currencySymbol.value = "¥";
- }
- // 点击修改
- const editClk = (row, idx) => {
- // 如果点击的是修改
- if (idx === 1) {
- tableData.value.forEach((item) => {
- if (row.id !== item.id) {
- item.isEdit = false;
- }
- });
- row.isEdit = !row.isEdit;
- } else {
- cofficentForm.no = row.no;
- cofficentForm.price = row.rmbPrice;
- cofficentForm.type = 0;
- updatePrice(row);
- }
- };
- // 修改价格
- const updatePrice = (row) => {
- console.log("cofficentForm", cofficentForm);
- // 如果点击的是提交
- Api_getUpdaProdPrice(cofficentForm).then((res) => {
- showToast(res.data.message);
- if (row) {
- row.isEdit = false;
- }
- setTimeout(() => {
- getList();
- }, 500);
- });
- };
- return {
- cofficentForm,
- editClk,
- tableData,
- showSugerPhoto,
- kDialogRef,
- noticeClk,
- confirmClk,
- equipmentName,
- currencySymbol,
- };
- },
- };
- </script>
- <style lang="less" scoped>
- @primary-color: #4d6add;
- @card-bg: #ffffff;
- @text-primary: #2d3436;
- @border-color: #e4e7ec;
- .price-editor {
- background: #f8fafb;
- min-height: 100vh;
- .content-container {
- background: #f7f8fa;
- height: calc(100% - 50px);
- overflow: auto;
- overflow-x: hidden;
- }
- }
- .device-card {
- background: @card-bg;
- border-radius: 12px;
- box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);
- margin: 10px;
- padding: 16px;
- .device-header {
- display: flex;
- align-items: center;
- .header-indicator {
- width: 3px;
- height: 20px;
- background: @primary-color;
- margin-right: 12px;
- border-radius: 2px;
- }
- .device-name {
- margin: 0;
- font-size: 15px;
- color: #404d74;
- font-weight: 550;
- // 长名称处理
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- max-width: 70vw;
- }
- }
- }
- .goods-card {
- background: @card-bg;
- border-radius: 12px;
- box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);
- padding: 16px;
- margin: 10px;
- .card-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 20px;
- .goods-count {
- color: #666;
- .highlight {
- color: @primary-color;
- font-weight: 500;
- margin: 0 4px;
- }
- }
- .batch-btn {
- height: 32px;
- padding: 0 16px;
- font-size: 13px;
- }
- }
- }
- .goods-list {
- .goods-item {
- display: flex;
- justify-content: space-between;
- align-items: center;
- padding: 12px 0;
- border-bottom: 1px solid @border-color;
- &:last-child {
- border-bottom: none;
- }
- .goods-info {
- display: flex;
- align-items: center;
- flex: 1;
- .goods-image {
- width: 48px;
- height: 48px;
- border-radius: 6px;
- margin-right: 12px;
- }
- .goods-name {
- font-size: 14px;
- color: @text-primary;
- max-width: 200px;
- .ellipsis();
- }
- }
- .price-action {
- display: flex;
- align-items: center;
- gap: 12px;
- .price-input {
- width: 120px;
- background: #f8fafb;
- border-radius: 6px;
- padding: 4px 12px;
- :deep(.van-field__control) {
- text-align: right;
- }
- }
- .currency-symbol {
- color: @primary-color;
- margin-left: 4px;
- }
- .price-display {
- color: #df5e4c;
- font-size: 15px;
- }
- .action-icon {
- color: @primary-color;
- font-size: 20px;
- padding: 8px;
- }
- }
- }
- }
- .batch-field {
- :deep(.van-field__label) {
- width: 100px;
- }
- }
- .ellipsis() {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- }
- @media (max-width: 480px) {
- .goods-card {
- padding: 12px;
- .goods-item {
- .goods-name {
- max-width: 160px;
- }
- }
- }
- }
- :deep(.van-image__img) {
- object-fit: contain !important;
- }
- </style>
|