智能立体仓储WMS库位分配C#实现

using System;
using System.Collections.Generic;
using Mirle.Def;
using System.Data;
using DataBase;

namespace DB.WMS.Fun
{
    public class clsLocMst
    {
        /// <summary>
        /// 確認儲位是否是外儲位
        /// </summary>
        /// <param name="sLoc"></param>
        /// <param name="IsOutside"></param>
        /// <param name="db"></param>
        /// <returns></returns>
        public int CheckLocIsOutside(string sLoc, ref bool IsOutside, ref string sLocDD, ref bool IsEmpty_DD, ref string BoxID_DD, DataBase.DB db)
        {
            try
            {
                int iRet = CheckLocIsOutside(sLoc, ref IsOutside, db);
                if (iRet == DBResult.Success)
                {
                    sLocDD = GetLocDD(sLoc, db);
                    if (string.IsNullOrWhiteSpace(sLocDD))
                        throw new Exception($"找不到{sLoc}的對照儲位!");
                    return CheckLocIsEmpty(sLocDD, ref IsEmpty_DD, ref BoxID_DD, db);
                }

                return iRet;
            }
            catch (Exception ex)
            {
                var cmet = System.Reflection.MethodBase.GetCurrentMethod();
                clsWriLog.Log.subWriteExLog(cmet.DeclaringType.FullName + "." + cmet.Name, ex.Message);
                return DBResult.Exception;
            }
        }

        /// <summary>
        /// 確認儲位是否是外儲位
        /// </summary>
        /// <param name="sLoc"></param>
        /// <param name="IsOutside"></param>
        /// <param name="db"></param>
        /// <returns></returns>
        public int CheckLocIsOutside(string sLoc, ref bool IsOutside, DataBase.DB db)
        {
            DataTable dtTmp = new DataTable();
            try
            {
                string strEM = "";
                string strSql = $"select IS_INSIDE from {Parameter.clsLocMst.TableName} where {Parameter.clsLocMst.Column.Loc} = '{sLoc}' ";
                int iRet = db.GetDataTable(strSql, ref dtTmp, ref strEM);
                if (iRet == DBResult.Success)
                {
                    IsOutside = Convert.ToString(dtTmp.Rows[0][0]) == "N" ? true : false;
                }
                else
                {
                    clsWriLog.Log.FunWriLog(WriLog.clsLog.Type.Error, $"{strSql} => {strEM}");
                }

                return iRet;
            }
            catch (Exception ex)
            {
                var cmet = System.Reflection.MethodBase.GetCurrentMethod();
                clsWriLog.Log.subWriteExLog(cmet.DeclaringType.FullName + "." + cmet.Name, ex.Message);
                return DBResult.Exception;
            }
            finally
            {
                dtTmp = null;
            }
        }
        public bool FunTestConnection(DataBase.DB db)
        {
            DataTable dtTmp = new DataTable();
            try
            {
                string strEM = "";
                string strSql = $"select TOP (10) {Parameter.clsLocMst.Column.Loc} from {Parameter.clsLocMst.TableName} ";
                int iRet = db.GetDataTable(strSql, ref dtTmp, ref strEM);
                if (iRet == DBResult.Success)
                {
                    return true;
                }
                else
                {
                    clsWriLog.Log.FunWriLog(WriLog.clsLog.Type.Error, $"{strSql} => {strEM}");
                    return false;
                }
            }
            catch (Exception ex)
            {
                var cmet = System.Reflection.MethodBase.GetCurrentMethod();
                clsWriLog.Log.subWriteExLog(cmet.DeclaringType.FullName + "." + cmet.Name, ex.Message);
                return false;
            }
            finally
            {
                dtTmp = null;
            }
        }
        public string GetLocDD(string sLoc, DataBase.DB db)
        {
            DataTable dtTmp = new DataTable();
            try
            {
                string strEM = "";
                string strSql = $"select {Parameter.clsLocMst.Column.LocDD} from {Parameter.clsLocMst.TableName} where " +
                    $"{Parameter.clsLocMst.Column.Loc} = '{sLoc}' ";
                int iRet = db.GetDataTable(strSql, ref dtTmp, ref strEM);
                if (iRet == DBResult.Success)
                {
                    return Convert.ToString(dtTmp.Rows[0][0]);
                }
                else
                {
                    clsWriLog.Log.FunWriLog(WriLog.clsLog.Type.Error, $"{strSql} => {strEM}");
                    return string.Empty;
                }
            }
            catch (Exception ex)
            {
                var cmet = System.Reflection.MethodBase.GetCurrentMethod();
                clsWriLog.Log.subWriteExLog(cmet.DeclaringType.FullName + "." + cmet.Name, ex.Message);
                return string.Empty;
            }
            finally
            {
                dtTmp = null;
            }
        }
        public string GetLocDDandStatus(string sLoc, ref bool IsEmpty, DataBase.DB db)
        {
            DataTable dtTmp = new DataTable();
            try
            {
                string strEM = "";
                string strSql = $"select {Parameter.clsLocMst.Column.Loc}, {Parameter.clsLocMst.Column.StorageSts}, {Parameter.clsLocMst.Column.OperateSts} from {Parameter.clsLocMst.TableName} where " +
                    $"{Parameter.clsLocMst.Column.LocDD} = '{sLoc}' ";
                int iRet = db.GetDataTable(strSql, ref dtTmp, ref strEM);
                if (iRet == DBResult.Success)
                {
                    IsEmpty = ((Convert.ToString(dtTmp.Rows[0][Parameter.clsLocMst.Column.StorageSts]).Trim().ToUpper() == clsConstValue.LocSts.Empty) && 
                              (Convert.ToString(dtTmp.Rows[0][Parameter.clsLocMst.Column.OperateSts]).Trim().ToUpper() == clsConstValue.LocSts.Normal));
                    return Convert.ToString(dtTmp.Rows[0][Parameter.clsLocMst.Column.Loc]);
                }
                else
                {
                    clsWriLog.Log.FunWriLog(WriLog.clsLog.Type.Error, $"{strSql} => {strEM}");
                    return string.Empty;
                }
            }
            catch (Exception ex)
            {
                var cmet = System.Reflection.MethodBase.GetCurrentMethod();
                clsWriLog.Log.subWriteExLog(cmet.DeclaringType.FullName + "." + cmet.Name, ex.Message);
                return string.Empty;
            }
            finally
            {
                dtTmp = null;
            }
        }
        public int CheckLocIsEmpty(string sLoc, ref bool IsEmpty, DataBase.DB db)
        {
            DataTable dtTmp = new DataTable();
            try
            {
                string strEM = "";
                string strSql = $"select {Parameter.clsLocMst.Column.StorageSts} from {Parameter.clsLocMst.TableName} where {Parameter.clsLocMst.Column.Loc} = '{sLoc}' ";
                int iRet = db.GetDataTable(strSql, ref dtTmp, ref strEM);
                if (iRet == DBResult.Success)
                {
                    IsEmpty = Convert.ToString(dtTmp.Rows[0][Parameter.clsLocMst.Column.StorageSts]).Trim().ToUpper() ==
                        clsConstValue.LocSts.Empty;
                }
                else
                {
                    clsWriLog.Log.FunWriLog(WriLog.clsLog.Type.Error, $"{strSql} => {strEM}");
                }

                return iRet;
            }
            catch (Exception ex)
            {
                var cmet = System.Reflection.MethodBase.GetCurrentMethod();
                clsWriLog.Log.subWriteExLog(cmet.DeclaringType.FullName + "." + cmet.Name, ex.Message);
                return DBResult.Exception;
            }
            finally
            {
                dtTmp = null;
            }
        }

        public int CheckLocIsEmpty(string sLoc, ref bool IsEmpty, ref string BoxID, DataBase.DB db)
        {
            DataTable dtTmp = new DataTable();
            try
            {
                string strEM = "";
                string strSql = $"select {Parameter.clsLocMst.Column.StorageSts}, {Parameter.clsLocMst.Column.BoxID} from " +
                    $"{Parameter.clsLocMst.TableName} where {Parameter.clsLocMst.Column.Loc} = '{sLoc}' ";
                int iRet = db.GetDataTable(strSql, ref dtTmp, ref strEM);
                if (iRet == DBResult.Success)
                {
                    IsEmpty = Convert.ToString(dtTmp.Rows[0][Parameter.clsLocMst.Column.StorageSts]).Trim().ToUpper() == clsConstValue.LocSts.Empty;
                    BoxID = Convert.ToString(dtTmp.Rows[0][Parameter.clsLocMst.Column.BoxID]);
                }
                else
                {
                    clsWriLog.Log.FunWriLog(WriLog.clsLog.Type.Error, $"{strSql} => {strEM}");
                }

                return iRet;
            }
            catch (Exception ex)
            {
                var cmet = System.Reflection.MethodBase.GetCurrentMethod();
                clsWriLog.Log.subWriteExLog(cmet.DeclaringType.FullName + "." + cmet.Name, ex.Message);
                return DBResult.Exception;
            }
            finally
            {
                dtTmp = null;
            }
        }

        public int CheckLineByBoxID(string sBoxID, ref int StockerID, ref string sLoc, DataBase.DB db)
        {
            DataTable dtTmp = new DataTable();
            try
            {
                string strSql = $"select * from {Parameter.clsLocMst.TableName} where {Parameter.clsLocMst.Column.BoxID} = '{sBoxID}' ";
                string strEM = "";
                int iRet = db.GetDataTable(strSql, ref dtTmp, ref strEM);
                if (iRet == DBResult.Success)
                {
                    StockerID = Convert.ToInt32(dtTmp.Rows[0][Parameter.clsLocMst.Column.EquNo]);
                    sLoc = Convert.ToString(dtTmp.Rows[0][Parameter.clsLocMst.Column.Loc]);
                }
                else clsWriLog.Log.FunWriLog(WriLog.clsLog.Type.Error, $"{strSql} => {strEM}");

                return iRet;
            }
            catch (Exception ex)
            {
                var cmet = System.Reflection.MethodBase.GetCurrentMethod();
                clsWriLog.Log.subWriteExLog(cmet.DeclaringType.FullName + "." + cmet.Name, ex.Message);
                return DBResult.Exception;
            }
            finally
            {
                dtTmp = null;
            }
        }

        public string funSearchEmptyLoc(string Equ_No, clsEnum.LocSts_Double locSts, DataBase.DB db)
        {
            string strEM = "";
            DataTable dtTmp = new DataTable();
            try
            {
                string sSQL = $"SELECT TOP 1 {Parameter.clsLocMst.Column.Loc} FROM " +
                    $"{Parameter.clsLocMst.TableName} WHERE {Parameter.clsLocMst.Column.StorageSts} = '" + clsConstValue.LocSts.Empty + "' ";
                sSQL += $" AND {Parameter.clsLocMst.Column.OperateSts} = '{clsConstValue.LocSts.Normal}' and {Parameter.clsLocMst.Column.EquNo} = '" + Equ_No + "' ";

                if (locSts == clsEnum.LocSts_Double.NNNN) //找外側空庫位
                {
                    sSQL += $" AND {Parameter.clsLocMst.Column.Loc} IN (SELECT {Parameter.clsLocMst.Column.LocDD} FROM " +
                        $"{Parameter.clsLocMst.TableName}" +
                        $" WHERE {Parameter.clsLocMst.Column.StorageSts}='{clsConstValue.LocSts.Empty}' AND {Parameter.clsLocMst.Column.OperateSts} = '{clsConstValue.LocSts.Normal}'" +
                        $" AND IS_INSIDE = 'Y') ";
                }
                else if (locSts == clsEnum.LocSts_Double.SNNS)
                {
                    sSQL += $" AND {Parameter.clsLocMst.Column.Loc} IN (SELECT {Parameter.clsLocMst.Column.LocDD} FROM " +
                        $"{Parameter.clsLocMst.TableName}" +
                        $" WHERE {Parameter.clsLocMst.Column.StorageSts} in ('{clsConstValue.LocSts.Full}','{clsConstValue.LocSts.NotFull}')" +
                        $" AND {Parameter.clsLocMst.Column.OperateSts} = '{clsConstValue.LocSts.Normal}' AND IS_INSIDE = 'N') ";
                }
                else if (locSts == clsEnum.LocSts_Double.ENNE)
                {
                    sSQL += $" AND {Parameter.clsLocMst.Column.Loc} IN (SELECT {Parameter.clsLocMst.Column.LocDD} FROM " +
                        $"{Parameter.clsLocMst.TableName}" +
                        $" WHERE {Parameter.clsLocMst.Column.StorageSts} = '{clsConstValue.LocSts.EmptyBox}' AND {Parameter.clsLocMst.Column.OperateSts} = '{clsConstValue.LocSts.Normal}'" +
                        " AND IS_INSIDE = 'N') ";
                }
                else if (locSts == clsEnum.LocSts_Double.XNNX)
                {
                    sSQL += $" AND {Parameter.clsLocMst.Column.Loc} IN (SELECT {Parameter.clsLocMst.Column.LocDD} FROM " +
                        $"{Parameter.clsLocMst.TableName}" +
                        $" WHERE {Parameter.clsLocMst.Column.OperateSts} = '{clsConstValue.LocSts.Block}' AND IS_INSIDE = 'N') ";
                }
                else { } //Single Deep

                sSQL += $" ORDER BY {Parameter.clsLocMst.Column.BAY}, {Parameter.clsLocMst.Column.LEVEL}, {Parameter.clsLocMst.Column.ROW} DESC";

                dtTmp = new DataTable();
                string sNewLoc;
                if (db.GetDataTable(sSQL, ref dtTmp, ref strEM) == DBResult.Success)
                {
                    sNewLoc = dtTmp.Rows[0][Parameter.clsLocMst.Column.Loc].ToString();
                }
                else
                {
                    sNewLoc = "";
                }

                return sNewLoc;
            }
            catch (Exception ex)
            {
                var cmet = System.Reflection.MethodBase.GetCurrentMethod();
                clsWriLog.Log.subWriteExLog(cmet.DeclaringType.FullName + "." + cmet.Name, ex.Message);
                return "";
            }
            finally
            {
                dtTmp = null;
            }
        }

        public string funSearchEmptyLoc_Abnormal(string Equ_No, clsEnum.LocSts_Double locSts, string sSource, DataBase.DB db)
        {
            string sNewLoc = "";
            string strEM = "";
            DataTable dtTmp = new DataTable();
            try
            {
                string sSQL = $"SELECT TOP 1 {Parameter.clsLocMst.Column.Loc} FROM " +
                      $"{Parameter.clsLocMst.TableName} WHERE {Parameter.clsLocMst.Column.StorageSts} = '" + clsConstValue.LocSts.Empty + "' ";
                sSQL += $" AND {Parameter.clsLocMst.Column.OperateSts} = '{clsConstValue.LocSts.Normal}' and {Parameter.clsLocMst.Column.EquNo} = '" + Equ_No + "' ";
                switch (sSource.Substring(0, 2))
                {
                    case "09":
                    case "11":
                        sSQL += $" and SUBSTRING({Parameter.clsLocMst.Column.Loc},1,2) IN ('09','11') ";
                        break;
                    case "10":
                    case "12":
                        sSQL += $" and SUBSTRING({Parameter.clsLocMst.Column.Loc},1,2) IN ('10','12') ";
                        break;
                    case "13":
                    case "15":
                        sSQL += $" and SUBSTRING({Parameter.clsLocMst.Column.Loc},1,2) IN ('13','15') ";
                        break;
                    case "14":
                    case "16":
                        sSQL += $" and SUBSTRING({Parameter.clsLocMst.Column.Loc},1,2) IN ('14','16') ";
                        break;
                    case "17":
                    case "19":
                        sSQL += $" and SUBSTRING({Parameter.clsLocMst.Column.Loc},1,2) IN ('17','19') ";
                        break;
                    case "18":
                    case "20":
                        sSQL += $" and SUBSTRING({Parameter.clsLocMst.Column.Loc},1,2) IN ('18','20') ";
                        break;
                    default:
                        return "";
                }

                if (locSts == clsEnum.LocSts_Double.NNNN) //找外側空庫位
                {
                    sSQL += $" AND {Parameter.clsLocMst.Column.Loc} IN (SELECT {Parameter.clsLocMst.Column.LocDD} FROM " +
                       $"{Parameter.clsLocMst.TableName}" +
                       $" WHERE {Parameter.clsLocMst.Column.StorageSts}='{clsConstValue.LocSts.Empty}' AND {Parameter.clsLocMst.Column.OperateSts} = '{clsConstValue.LocSts.Normal}'" +
                       $" AND IS_INSIDE = 'Y') ";
                }
                else if (locSts == clsEnum.LocSts_Double.SNNS)
                {
                    sSQL += $" AND {Parameter.clsLocMst.Column.Loc} IN (SELECT {Parameter.clsLocMst.Column.LocDD} FROM " +
                        $"{Parameter.clsLocMst.TableName}" +
                        $" WHERE {Parameter.clsLocMst.Column.StorageSts} in ('{clsConstValue.LocSts.Full}','{clsConstValue.LocSts.NotFull}')" +
                        $" AND {Parameter.clsLocMst.Column.OperateSts} = '{clsConstValue.LocSts.Normal}' AND IS_INSIDE = 'N') ";
                }
                else if (locSts == clsEnum.LocSts_Double.ENNE)
                {
                    sSQL += $" AND {Parameter.clsLocMst.Column.Loc} IN (SELECT {Parameter.clsLocMst.Column.LocDD} FROM " +
                       $"{Parameter.clsLocMst.TableName}" +
                       $" WHERE {Parameter.clsLocMst.Column.StorageSts} = '{clsConstValue.LocSts.EmptyBox}' AND {Parameter.clsLocMst.Column.OperateSts} = '{clsConstValue.LocSts.Normal}'" +
                       " AND IS_INSIDE = 'N') ";
                }
                else if (locSts == clsEnum.LocSts_Double.XNNX)
                {
                    sSQL += $" AND {Parameter.clsLocMst.Column.Loc} IN (SELECT {Parameter.clsLocMst.Column.LocDD} FROM " +
                       $"{Parameter.clsLocMst.TableName}" +
                       $" WHERE {Parameter.clsLocMst.Column.OperateSts} = '{clsConstValue.LocSts.Block}' AND IS_INSIDE = 'N') ";
                }
                else return "";

                sSQL += $" ORDER BY {Parameter.clsLocMst.Column.BAY}, {Parameter.clsLocMst.Column.LEVEL}, {Parameter.clsLocMst.Column.ROW} DESC";

                dtTmp = new DataTable();
                if (db.GetDataTable(sSQL, ref dtTmp, ref strEM) == DBResult.Success)
                {
                    sNewLoc = dtTmp.Rows[0][Parameter.clsLocMst.Column.Loc].ToString();
                }
                else
                {
                    sNewLoc = "";
                }

                return sNewLoc;
            }
            catch (Exception ex)
            {
                var cmet = System.Reflection.MethodBase.GetCurrentMethod();
                clsWriLog.Log.subWriteExLog(cmet.DeclaringType.FullName + "." + cmet.Name, ex.Message);
                return "";
            }
            finally
            {
                dtTmp = null;
            }
        }

        public int funCheckCountForEmptyLoc(ref DataTable dtTmp, DataBase.DB db)
        {
            try
            {
                string strEM = "";
                string strSql = $"select {clsConstValue.LineName.Line3} = (SELECT COUNT({Parameter.clsLocMst.Column.StorageSts}) from {Parameter.clsLocMst.TableName} WHERE ({Parameter.clsLocMst.Column.StorageSts} = '{clsConstValue.LocSts.Empty}' AND CRANE = '{clsConstValue.CraneName.Line3}')), " +
                    $"{clsConstValue.LineName.Line4} = (SELECT COUNT({Parameter.clsLocMst.Column.StorageSts}) from {Parameter.clsLocMst.TableName} WHERE ({Parameter.clsLocMst.Column.StorageSts} = '{clsConstValue.LocSts.Empty}' AND CRANE = '{clsConstValue.CraneName.Line4}')), " +
                    $"{clsConstValue.LineName.Line5} = (SELECT COUNT({Parameter.clsLocMst.Column.StorageSts}) from {Parameter.clsLocMst.TableName} WHERE ({Parameter.clsLocMst.Column.StorageSts} = '{clsConstValue.LocSts.Empty}' AND CRANE = '{clsConstValue.CraneName.Line5}'))";
                int iRet = db.GetDataTable(strSql, ref dtTmp, ref strEM);
                if (iRet != DBResult.Success)
                {
                    clsWriLog.Log.FunWriLog(WriLog.clsLog.Type.Error, $"{strSql} => {strEM}");
                }

                return iRet;
            }
            catch (Exception ex)
            {
                var cmet = System.Reflection.MethodBase.GetCurrentMethod();
                clsWriLog.Log.subWriteExLog(cmet.DeclaringType.FullName + "." + cmet.Name, ex.Message);
                return DBResult.Exception;
            }
        }
    }
}

  • 28
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
BS .net 4.0 C# Web SQL Server 2012-2017 Fastreport报表 介绍一套仓储管理系统源码,以下为作者留言 吉特仓储管系统基础版本 适合单仓,基本的仓管理,出管理,盘点,报损,移位等管理,有着可视化图表。 系统采用Bootstrap 开发,UI 相对比较简单,业务功能不复杂,适合一般的学习开发者。 软件声明 (1)软件允许各位开发者用于自己软件的项目开发,请保留软件标题信息,版权信息,在下不胜感激。 (2)坚决抵制某些企业拿了源程序,对外宣称是自己公司团队开发,如若发现必定网络舆论讨伐。 (3)由于之前开源的版本和一些企业闹出版权问题,吉特仓储管理系统均为自己开发,其他公开销售源码,软件的均为未经授权的盗版,为不法企业和个人。 (4)本人目前定制二次开发各种仓系统,不单独销售成品软件,如有需求可以直接联系本人。 功能清单 主要包含功能如下: 系统管理 ----员工管理 ----角色管理 ----部门管理 ----菜单管理 ----权限分配 ----标识符管理 基本资料 ----供应商管理 ----位管理 ----客户管理 ----计量单位 ----产品类别 ----产品管理 仓管理 ----入管理 ----出管理 ----报损管理 ----移管理 ----盘点管理 ----退货管理 报表管理 ----存清单 ----货品统计 ----出入报表 ----入报表 ----出报表 ----报损报表 ----退货报表 ----客户报表 ----供应商报表 ----台账记录 ----自定义报表 readme中有作者联系方式
C#开发,可解析WMS服务,并进行浏览,功能强大,GIS开发人员可参考文件列表 Get Capabilities Example ........................\AssemblyInfo.cs ........................\Get Capabilities Example.csproj ........................\GetCapabilitiesExample.cs Get Map Asynch Example ......................\AssemblyInfo.cs ......................\Get Map Asynch Example.csproj ......................\GetMapAsynchExample.cs ......................\GetMapAsynchExample.resx Get Map Example ...............\AssemblyInfo.cs ...............\Get Map Example.csproj ...............\GetMapExample.cs GLOBECapabilities20040423.xml MapAnimation ............\AssemblyInfo.cs ............\Map Animation.csproj ............\MapAnimation.cs ............\MapAnimation.resx WMS Overview Article.html WMS Overview.sln Wms.Client ..........\AssemblyInfo.cs ..........\Capabilities.cs ..........\CLSDFOLD.BMP ..........\DefaultServerDescriptors.xml ..........\DownloadCache.cs ..........\ENTIRNET.BMP ..........\ENTIRNETX.bmp ..........\ENTIRNETX.ICO ..........\ExtensionMap.cs ..........\Layer.cs ..........\OPENFOLD.BMP ..........\PreviewDialog.cs ..........\PreviewDialog.resx ..........\RequestBuilder.cs ..........\Retriever.cs ..........\Server.cs ..........\ServerAddDialog.cs ..........\ServerAddDialog.resx ..........\ServerDescriptor.cs ..........\Wms.Client.csproj ..........\WmsDialog.cs ..........\WmsDialog.resx ..........\WmsException.cs ..........\WmsServerDescriptors.cs ..........\WmsServerDescriptors.xsd WMSBrowser ..........\AssemblyInfo.cs ..........\MapForm.cs ..........\MapForm.resx ..........\WMSBrowser.cs ..........\WMSBrowser.csproj ..........\WMSBrowser.resx

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

softshow1026

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值