gaoluyang
2025-09-26 5209c2fb7f9b764aed59f827420e151bf649bdb3
生产派工页面开发联调
已添加3个文件
已修改2个文件
868 ■■■■■ 文件已修改
src/pages.json 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/index.vue 58 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/productionManagement/productionDispatching/components/DispatchModal.vue 399 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/productionManagement/productionDispatching/components/formDia.vue 169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/productionManagement/productionDispatching/index.vue 235 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages.json
@@ -406,6 +406,13 @@
        "navigationBarTitleText": "生产订单",
        "navigationStyle": "custom"
      }
    },
    {
      "path": "pages/productionManagement/productionDispatching/index",
      "style": {
        "navigationBarTitleText": "生产派工",
        "navigationStyle": "custom"
      }
    }
  ],
  "subPackages": [
src/pages/index.vue
@@ -124,34 +124,34 @@
        </view>
        
        <!-- ç”Ÿäº§ç®¡æŽ§æ¨¡å— -->
        <view class="common-module production-module">
            <view class="module-header">
                <view class="module-title-container">
                    <text class="module-title">生产管控</text>
                </view>
            </view>
            <view class="module-content">
                <up-grid
                    :border="false"
                    col="4"
                >
                    <up-grid-item
                        v-for="(item, index) in productionItems"
                        :key="index"
                        @click="handleCommonItemClick(item)"
                    >
                        <view class="icon-container" :style="{ background: item.bgColor }">
                            <up-icon
                                :name="item.icon"
                                :size="58"
                                color="#ffffff"
                            ></up-icon>
                        </view>
                        <text class="item-label">{{item.label}}</text>
                    </up-grid-item>
                </up-grid>
            </view>
        </view>
<!--        <view class="common-module production-module">-->
<!--            <view class="module-header">-->
<!--                <view class="module-title-container">-->
<!--                    <text class="module-title">生产管控</text>-->
<!--                </view>-->
<!--            </view>-->
<!--            <view class="module-content">-->
<!--                <up-grid-->
<!--                    :border="false"-->
<!--                    col="4"-->
<!--                >-->
<!--                    <up-grid-item-->
<!--                        v-for="(item, index) in productionItems"-->
<!--                        :key="index"-->
<!--                        @click="handleCommonItemClick(item)"-->
<!--                    >-->
<!--                        <view class="icon-container" :style="{ background: item.bgColor }">-->
<!--                            <up-icon-->
<!--                                :name="item.icon"-->
<!--                                :size="58"-->
<!--                                color="#ffffff"-->
<!--                            ></up-icon>-->
<!--                        </view>-->
<!--                        <text class="item-label">{{item.label}}</text>-->
<!--                    </up-grid-item>-->
<!--                </up-grid>-->
<!--            </view>-->
<!--        </view>-->
        
        <!-- è®¾å¤‡ç®¡ç†æ¨¡å— -->
        <view class="common-module equipment-module">
@@ -433,7 +433,7 @@
            break;
        case '生产派工':
            uni.navigateTo({
                url: '/pages/productionManagement/productionDispatch/index'
                url: '/pages/productionManagement/productionDispatching/index'
            });
            break;
        case '工序排产':
src/pages/productionManagement/productionDispatching/components/DispatchModal.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,399 @@
<template>
    <up-popup
        v-model:show="show"
        mode="bottom"
        :round="20"
        :safeAreaInsetBottom="true"
        @close="handleClose"
        @open="handleOpen"
    >
        <view class="dispatch-modal">
            <!-- å¤´éƒ¨ -->
            <view class="modal-header">
                <text class="modal-title">生产派工</text>
                <view class="close-btn" @click="handleClose">
                    <up-icon name="close" size="20" color="#999"></up-icon>
                </view>
            </view>
            <!-- è¡¨å•内容 -->
            <view class="modal-content">
                <up-form
                    :model="form"
                    ref="formRef"
                    :rules="rules"
                    labelWidth="120"
                >
                    <!-- é¡¹ç›®åŸºæœ¬ä¿¡æ¯ -->
                    <view class="form-section">
                        <text class="section-title">项目信息</text>
                        <up-form-item label="项目名称" prop="projectName">
                            <up-input
                                v-model="form.projectName"
                                disabled
                                placeholder="项目名称"
                            />
                        </up-form-item>
                        <up-form-item label="产品大类" prop="productCategory">
                            <up-input
                                v-model="form.productCategory"
                                disabled
                                placeholder="产品大类"
                            />
                        </up-form-item>
                    </view>
                    <!-- æ•°é‡ä¿¡æ¯ -->
                    <view class="form-section">
                        <text class="section-title">数量信息</text>
                        <up-form-item label="总数量" prop="quantity">
                            <up-input
                                v-model="form.quantity"
                                disabled
                                placeholder="总数量"
                            />
                        </up-form-item>
                        <up-form-item label="待排产数量" prop="pendingQuantity">
                            <up-input
                                v-model="form.pendingQuantity"
                                disabled
                                placeholder="待排产数量"
                            />
                        </up-form-item>
                        <up-form-item label="本次排产数量" prop="schedulingNum" required>
                            <up-number-box
                                v-model="form.schedulingNum"
                                :min="0"
                                :max="form.pendingQuantity"
                                :step="0.1"
                                :precision="2"
                                @change="handleNumChange"
                            />
                        </up-form-item>
                    </view>
                    <!-- æ´¾å·¥ä¿¡æ¯ -->
                    <view class="form-section">
                        <text class="section-title">派工信息</text>
                        <up-form-item label="派工人" prop="schedulingUserId" required>
                            <up-input
                                v-model="selectedUserName"
                                placeholder="请选择派工人"
                                readonly
                                @click="showUserPicker = true"
                                suffixIcon="arrow-down"
                            />
                        </up-form-item>
                        <up-form-item label="派工日期" prop="schedulingDate" required>
                            <up-input
                                v-model="form.schedulingDate"
                                placeholder="请选择派工日期"
                                readonly
                                @click="showDatePicker = true"
                                suffixIcon="calendar"
                            />
                        </up-form-item>
                    </view>
                </up-form>
            </view>
            <!-- åº•部按钮 -->
            <view class="modal-footer">
                <up-button
                    @click="handleClose"
                    text="取消"
                    type="info"
                    plain
                    :customStyle="{ marginRight: '12px', flex: 1 }"
                />
                <up-button
                    @click="handleConfirm"
                    text="确认派工"
                    type="primary"
                    :customStyle="{ flex: 1 }"
                    :loading="submitting"
                />
            </view>
        </view>
        <!-- äººå‘˜é€‰æ‹©å™¨ -->
        <up-picker
            v-model="showUserPicker"
            :columns="userColumns"
            @confirm="handleUserSelect"
            @cancel="showUserPicker = false"
        />
        <!-- æ—¥æœŸé€‰æ‹©å™¨ -->
        <up-datetime-picker
            v-model="showDatePicker"
            mode="date"
            @confirm="handleDateSelect"
            @cancel="showDatePicker = false"
        />
    </up-popup>
</template>
<script setup>
import { ref, reactive, computed, getCurrentInstance } from 'vue';
import { userListNoPageByTenantId } from "@/api/system/user.js";
import { productionDispatch } from "@/api/productionManagement/productionOrder.js";
import useUserStore from "@/store/modules/user";
import dayjs from "dayjs";
const { proxy } = getCurrentInstance();
const userStore = useUserStore();
const emit = defineEmits(['confirm']);
// å¼¹çª—显示状态
const show = ref(false);
const submitting = ref(false);
// é€‰æ‹©å™¨æ˜¾ç¤ºçŠ¶æ€
const showUserPicker = ref(false);
const showDatePicker = ref(false);
// ç”¨æˆ·åˆ—表
const userList = ref([]);
const userColumns = computed(() => [
    userList.value.map(user => ({
        label: user.nickName,
        value: user.userId
    }))
]);
// é€‰ä¸­çš„用户名称(用于显示)
const selectedUserName = computed(() => {
    const user = userList.value.find(u => u.userId === form.schedulingUserId);
    return user ? user.nickName : '';
});
// è¡¨å•数据
const form = reactive({
    projectName: "",
    productCategory: "",
    quantity: "",
    schedulingNum: 0,
    schedulingUserId: "",
    schedulingDate: "",
    pendingQuantity: 0,
    id: "" // åŽŸå§‹è®°å½•ID
});
// è¡¨å•验证规则
const rules = reactive({
    schedulingNum: [
        { required: true, message: "请输入排产数量", trigger: "blur" }
    ],
    schedulingUserId: [
        { required: true, message: "请选择派工人", trigger: "change" }
    ],
    schedulingDate: [
        { required: true, message: "请选择派工日期", trigger: "change" }
    ]
});
// è¡¨å•引用
const formRef = ref();
// æ‰“开弹窗
const open = async (rowData) => {
    try {
        // åŠ è½½ç”¨æˆ·åˆ—è¡¨
        const res = await userListNoPageByTenantId();
        userList.value = res.data || [];
        // å¡«å……表单数据
        Object.assign(form, {
            ...rowData,
            schedulingNum: 0,
            schedulingUserId: userStore.id,
            schedulingDate: dayjs().format("YYYY-MM-DD")
        });
        show.value = true;
    } catch (error) {
        uni.showToast({
            title: '加载用户列表失败',
            icon: 'error'
        });
    }
};
// å¤„理数量变化
const handleNumChange = (value) => {
    if (value > form.pendingQuantity) {
        form.schedulingNum = form.pendingQuantity;
        uni.showToast({
            title: '排产数量不可大于待排产数量',
            icon: 'none'
        });
    }
};
// å¤„理用户选择
const handleUserSelect = (params) => {
    if (params.value && params.value.length > 0) {
        form.schedulingUserId = params.value[0];
    }
    showUserPicker.value = false;
};
// å¤„理日期选择
const handleDateSelect = (params) => {
    if (params.value) {
        form.schedulingDate = dayjs(params.value).format("YYYY-MM-DD");
    }
    showDatePicker.value = false;
};
// ç¡®è®¤æ´¾å·¥
const handleConfirm = async () => {
    try {
        // è¡¨å•验证
        const valid = await formRef.value?.validate();
        if (!valid) return;
        if (form.schedulingNum <= 0) {
            uni.showToast({
                title: '排产数量必须大于0',
                icon: 'none'
            });
            return;
        }
        submitting.value = true;
        // æäº¤æ´¾å·¥æ•°æ®
        await productionDispatch(form);
        uni.showToast({
            title: '派工成功',
            icon: 'success'
        });
        handleClose();
        emit('confirm');
    } catch (error) {
        uni.showToast({
            title: '派工失败',
            icon: 'error'
        });
    } finally {
        submitting.value = false;
    }
};
// å¼¹çª—打开事件
const handleOpen = () => {
    // å¼¹çª—打开时的处理
};
// å…³é—­å¼¹çª—
const handleClose = () => {
    show.value = false;
    showUserPicker.value = false;
    showDatePicker.value = false;
    // é‡ç½®è¡¨å•
    Object.assign(form, {
        projectName: "",
        productCategory: "",
        quantity: "",
        schedulingNum: 0,
        schedulingUserId: "",
        schedulingDate: "",
        pendingQuantity: 0,
        id: ""
    });
};
// æš´éœ²æ–¹æ³•
defineExpose({
    open
});
</script>
<style scoped lang="scss">
.dispatch-modal {
    background: #ffffff;
    border-radius: 20px 20px 0 0;
    max-height: 80vh;
    overflow: hidden;
    display: flex;
    flex-direction: column;
}
.modal-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 20px 20px 0 20px;
    border-bottom: 1px solid #f0f0f0;
    padding-bottom: 16px;
    margin-bottom: 20px;
}
.modal-title {
    font-size: 18px;
    font-weight: 600;
    color: #333;
}
.close-btn {
    padding: 4px;
    &:active {
        opacity: 0.7;
    }
}
.modal-content {
    flex: 1;
    padding: 0 20px;
    overflow-y: auto;
}
.form-section {
    margin-bottom: 24px;
}
.section-title {
    display: block;
    font-size: 16px;
    font-weight: 600;
    color: #333;
    margin-bottom: 16px;
    padding-left: 8px;
    border-left: 3px solid #2979ff;
}
.modal-footer {
    display: flex;
    gap: 12px;
    padding: 20px;
    border-top: 1px solid #f0f0f0;
    background: #fafafa;
}
// uView ç»„件样式调整
:deep(.up-form-item) {
    margin-bottom: 20px;
}
:deep(.up-input) {
    background: #f8f9fa;
    border-radius: 8px;
}
:deep(.up-input--disabled) {
    background: #f0f0f0;
    color: #999;
}
:deep(.up-number-box) {
    background: #f8f9fa;
    border-radius: 8px;
}
</style>
src/pages/productionManagement/productionDispatching/components/formDia.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,169 @@
<template>
  <div>
    <el-dialog
        v-model="dialogFormVisible"
        title="生产派工"
        width="50%"
        @close="closeDia"
    >
      <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="项目名称:" prop="projectName">
              <el-input v-model="form.projectName" placeholder="请输入" clearable disabled/>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="产品大类:" prop="productCategory">
              <el-input v-model="form.productCategory" placeholder="请输入" clearable disabled/>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="总数量:" prop="quantity">
              <el-input v-model="form.quantity" placeholder="请输入" clearable disabled/>
            </el-form-item>
          </el-col>
          <el-col :span="12">
                        <el-form-item label="待排产数量:" prop="pendingQuantity">
                            <el-input v-model="form.pendingQuantity" placeholder="请输入" clearable disabled/>
                        </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
                        <el-form-item label="本次排产数量:" prop="schedulingNum">
                            <el-input-number
                                v-model="form.schedulingNum"
                                placeholder="请输入"
                                :min="0"
                                :step="0.1"
                                :precision="2"
                                clearable
                                @change="changeNum"
                                style="width: 100%"
                            />
                        </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
                    <el-col :span="12">
                        <el-form-item label="派工人:" prop="schedulingUserId">
                            <el-select
                                v-model="form.schedulingUserId"
                                placeholder="选择人员"
                                style="width: 100%;"
                            >
                                <el-option
                                    v-for="user in userList"
                                    :key="user.userId"
                                    :label="user.nickName"
                                    :value="user.userId"
                                />
                            </el-select>
                        </el-form-item>
                    </el-col>
          <el-col :span="12">
            <el-form-item label="派工日期:" prop="schedulingDate">
              <el-date-picker
                  v-model="form.schedulingDate"
                  type="date"
                  placeholder="请选择日期"
                  value-format="YYYY-MM-DD"
                  format="YYYY-MM-DD"
                  clearable
                  style="width: 100%"
              />
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <template #footer>
        <div class="dialog-footer">
          <el-button type="primary" @click="submitForm">确认</el-button>
          <el-button @click="closeDia">取消</el-button>
        </div>
      </template>
    </el-dialog>
  </div>
</template>
<script setup>
import {ref} from "vue";
import {getStaffJoinInfo, staffJoinAdd, staffJoinUpdate} from "@/api/personnelManagement/onboarding.js";
import {userListNoPageByTenantId} from "@/api/system/user.js";
import {productionDispatch} from "@/api/productionManagement/productionOrder.js";
import useUserStore from "@/store/modules/user.js";
import dayjs from "dayjs";
const { proxy } = getCurrentInstance()
const emit = defineEmits(['close'])
const dialogFormVisible = ref(false);
const operationType = ref('')
const data = reactive({
  form: {
        projectName: "",
        productCategory: "",
        quantity: "",
        schedulingNum: "",
        schedulingUserId: "",
        schedulingDate: "",
        pendingQuantity: "",
  },
  rules: {
        schedulingNum: [{ required: true, message: "请输入", trigger: "blur" },],
        schedulingUserId: [{ required: true, message: "请选择", trigger: "change" },],
        schedulingDate: [{ required: true, message: "请选择", trigger: "change" },],
  },
});
const { form, rules } = toRefs(data);
const userList = ref([])
const userStore = useUserStore()
// æ‰“开弹框
const openDialog = (type, row) => {
  operationType.value = type;
  dialogFormVisible.value = true;
    userListNoPageByTenantId().then((res) => {
        userList.value = res.data;
    });
    form.value = {...row}
    form.value.schedulingNum = 0
    form.value.schedulingUserId = userStore.id
    form.value.schedulingDate = dayjs().format("YYYY-MM-DD");
}
//
const changeNum = (value) => {
    if (value > form.value.pendingQuantity) {
        form.value.schedulingNum = form.value.pendingQuantity;
        proxy.$modal.msgWarning('排产数量不可大于待排产数量')
    }
}
// æäº¤äº§å“è¡¨å•
const submitForm = () => {
  proxy.$refs.formRef.validate(valid => {
    if (valid) {
            productionDispatch(form.value).then(res => {
                proxy.$modal.msgSuccess("提交成功");
                closeDia();
            })
    }
  })
}
// å…³é—­å¼¹æ¡†
const closeDia = () => {
  proxy.resetForm("formRef");
  dialogFormVisible.value = false;
  emit('close')
};
defineExpose({
  openDialog,
});
</script>
<style scoped>
</style>
src/pages/productionManagement/productionDispatching/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,235 @@
<template>
    <view class="production-dispatching">
        <!-- ä½¿ç”¨é€šç”¨é¡µé¢å¤´éƒ¨ç»„ä»¶ -->
        <PageHeader title="生产派工" @back="goBack" />
        <!-- æœç´¢åŒºåŸŸ -->
        <view class="search-section">
            <view class="search-bar">
                <view class="search-input">
                    <up-input
                        class="search-text"
                        placeholder="请输入客户名称搜索"
                        v-model="searchForm.customerName"
                        @change="handleQuery"
                        clearable
                    />
                </view>
                <view class="filter-button" @click="handleQuery">
                    <up-icon name="search" size="24" color="#999"></up-icon>
                </view>
            </view>
        </view>
        <!-- ç”Ÿäº§æ´¾å·¥åˆ—表 -->
        <view class="ledger-list" v-if="tableData.length > 0">
            <view v-for="(item, index) in tableData" :key="item.id || index">
                <view class="ledger-item">
                    <view class="item-header">
                        <view class="item-left">
                            <view class="document-icon">
                                <up-icon name="file-text" size="16" color="#ffffff"></up-icon>
                            </view>
                            <text class="item-id">{{ item.salesContractNo }}</text>
                        </view>
                    </view>
                    <up-divider></up-divider>
                    <view class="item-details">
                        <view class="detail-row">
                            <text class="detail-label">录入日期</text>
                            <text class="detail-value">{{ item.entryDate }}</text>
                        </view>
                        <view class="detail-row">
                            <text class="detail-label">客户合同号</text>
                            <text class="detail-value">{{ item.customerContractNo }}</text>
                        </view>
                        <view class="detail-row">
                            <text class="detail-label">客户名称</text>
                            <text class="detail-value">{{ item.customerName }}</text>
                        </view>
                        <view class="detail-row">
                            <text class="detail-label">项目名称</text>
                            <text class="detail-value">{{ item.projectName }}</text>
                        </view>
                        <view class="detail-row">
                            <text class="detail-label">产品大类</text>
                            <text class="detail-value">{{ item.productCategory }}</text>
                        </view>
                        <view class="detail-row">
                            <text class="detail-label">规格型号</text>
                            <text class="detail-value">{{ item.specificationModel }}</text>
                        </view>
                        <view class="detail-row">
                            <text class="detail-label">总数量</text>
                            <text class="detail-value">{{ item.quantity }} {{ item.unit }}</text>
                        </view>
                        <view class="detail-row">
                            <text class="detail-label">排产数量</text>
                            <text class="detail-value highlight">{{ item.schedulingNum }}</text>
                        </view>
                        <view class="detail-row">
                            <text class="detail-label">待排数量</text>
                            <text class="detail-value" :class="{ 'danger': item.pendingQuantity <= 0 }">{{ item.pendingQuantity }}</text>
                        </view>
                    </view>
                    <!-- æ“ä½œæŒ‰é’®åŒºåŸŸ -->
                    <view class="action-buttons">
                        <up-button
                            type="primary"
                            size="small"
                            @click="handleDispatch(item)"
                            class="action-btn"
                            :disabled="item.pendingQuantity <= 0"
                        >
                            ç”Ÿäº§æ´¾å·¥
                        </up-button>
                    </view>
                </view>
            </view>
        </view>
        <view v-else class="no-data">
            <text>暂无生产派工数据</text>
        </view>
        <!-- æ´¾å·¥å¼¹çª— -->
        <DispatchModal ref="dispatchModalRef" @confirm="handleDispatchConfirm" />
    </view>
</template>
<script setup>
import { ref, reactive, toRefs, getCurrentInstance } from "vue";
import { onShow } from '@dcloudio/uni-app';
import dayjs from "dayjs";
import {schedulingListPage} from "@/api/productionManagement/productionOrder.js";
import PageHeader from "@/components/PageHeader.vue";
import DispatchModal from "./components/DispatchModal.vue";
const { proxy } = getCurrentInstance();
// åŠ è½½çŠ¶æ€
const loading = ref(false);
// åˆ—表数据
const tableData = ref([]);
// æœç´¢è¡¨å•数据
const data = reactive({
    searchForm: {
        customerName: "",
    },
});
const { searchForm } = toRefs(data);
// åˆ†é¡µé…ç½®
const page = reactive({
    current: -1,
    size: -1,
});
// æ´¾å·¥å¼¹çª—引用
const dispatchModalRef = ref();
// é€šç”¨æç¤ºå‡½æ•°
const showLoadingToast = (message) => {
    uni.showLoading({
        title: message,
        mask: true
    });
};
const closeToast = () => {
    uni.hideLoading();
};
// è¿”回上一页
const goBack = () => {
    uni.navigateBack();
};
// æŸ¥è¯¢åˆ—表
const handleQuery = () => {
    getList();
};
// èŽ·å–åˆ—è¡¨æ•°æ®
const getList = () => {
    loading.value = true;
    showLoadingToast('加载中...');
    // æž„造请求参数
    const params = { ...searchForm.value, ...page };
    schedulingListPage(params).then((res) => {
        loading.value = false;
        closeToast();
        // å¤„理每条数据,增加pendingQuantity字段
        tableData.value = (res.data.records || []).map(item => ({
            ...item,
            pendingQuantity: (Number(item.quantity) || 0) - (Number(item.schedulingNum) || 0)
        }));
    }).catch(() => {
        loading.value = false;
        closeToast();
        uni.showToast({
            title: '加载失败',
            icon: 'error'
        });
    });
};
// å¤„理派工操作
const handleDispatch = (item) => {
    if (item.pendingQuantity <= 0) {
        uni.showToast({
            title: '该项目无需再派工',
            icon: 'none'
        });
        return;
    }
    dispatchModalRef.value?.open(item);
};
// å¤„理派工确认
const handleDispatchConfirm = () => {
    getList(); // åˆ·æ–°åˆ—表
};
// é¡µé¢æ˜¾ç¤ºæ—¶åŠ è½½æ•°æ®
onShow(() => {
    // åŠ è½½åˆ—è¡¨æ•°æ®
    getList();
});
</script>
<style scoped lang="scss">
@import '@/styles/sales-common.scss';
// ç”Ÿäº§æ´¾å·¥é¡µé¢æ ·å¼
.production-dispatching {
    min-height: 100vh;
    background: #f8f9fa;
    position: relative;
}
// åˆ—表项样式
.ledger-item {
    .detail-value.highlight {
        color: #ff6b35;
        font-weight: 600;
    }
    .detail-value.danger {
        color: #ee0a24;
        font-weight: 600;
    }
}
// é€‚配 uView ç»„件样式
:deep(.up-input) {
    background: transparent;
}
</style>